- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563371 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174234
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
# i' x4 Z) u+ O8 t6 J0 @Python深度学习之初窥神经网络% _4 H# ]5 c2 \7 ]! P- @/ ?5 @6 o
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。& I5 \5 k0 ^6 `, z
( B9 \; ], v/ r, h本文目录:9 n( P- `. |3 o, _
4 O; L' u0 w: _文章目录/ c4 k) t P! O7 X5 u
3 ]; B$ A* I) ^% E3 i' h6 jDeep Learning with Python
: y5 C: [2 }5 I初窥神经网络
# t4 Z) V: ]7 K2 I导入MNIST数据集' I2 @$ k" X l8 i6 @5 L
网络构建
, `5 h |& X) s4 M; b$ `4 [2 ?* s编译. y4 w: X4 {# F/ j# k( t
预处理
( p% X8 C; c3 b6 }( n图形处理
% R6 g; T* S Z标签处理6 M" P7 R8 _( S" F
训练网络
" c- g9 N1 v1 D/ j: x神经网络的数据表示, C0 w/ c5 W9 Q: y" d1 T6 r
认识张量. u; g! Y( T- M$ o" c, V
标量 (0D Tensors)1 A( P" |: s/ m+ D6 F6 I; x
向量 (1D Tensors)2 u6 W. L5 w0 Y- O. h, k
矩阵 (2D Tensors)
2 [- M0 B0 Z! X$ m: Q7 D高阶张量$ O9 j( x- f2 t
张量的三要素5 V1 g' Z1 |' s$ g
Numpy张量操作
7 h3 T6 r9 W2 k/ `- @张量切片:" {) B/ W. n; C4 Z$ I# V8 a
数据批量
# [- G2 |+ c, `: G常见数据张量表示5 m! Z, V W1 s
神经网络的“齿轮”: 张量运算
$ d5 L0 @% ]+ @5 @+ ?4 v逐元素操作(Element-wise)
* Z9 n/ W# u& J* \广播(Broadcasting)
t# z! D K, e3 Z张量点积(dot)* j& g) x4 h% d: T2 p8 s( |7 c
张量变形(reshaping)* i# `1 @: ~0 @9 G( f) ]! A! X
神经网络的“引擎”: 基于梯度的优化5 M" y& L9 R+ I, b/ [6 m
导数(derivative)) m, N% ~& B* L/ _! P
梯度(gradient)$ h* N: b0 \5 B g% Y1 g; Q2 p
随机梯度下降(Stochastic gradient descent)) w& H* b/ g0 o2 A
反向传播算法:链式求导
0 i- \: s6 C8 d. a4 _; Q% h# h本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。 S, n/ R- x) Z4 V' ?2 y
1 r% f) x3 Q! e, C- Y
初窥神经网络. P& J+ e4 F& D, e! A9 |9 S0 F' E
C4 i0 `4 q2 V学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
2 [( ^7 x% m8 f+ D8 X
1 R% s! w: i9 z* i7 I b0 X3 l* cMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
- Q Q, y0 }' H" N) E3 ?/ W8 Z: ?/ z
导入MNIST数据集
9 O8 l$ m4 s! j# X/ L/ _
+ C2 z4 ]8 o( C7 y# Loading the MNIST dataset in Keras
2 H* D, h0 T z" G! q6 f hfrom tensorflow.keras.datasets import mnist6 q6 }! ?9 m: V% Z6 E1 |& c/ M
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()9 s& j5 i9 \; n9 @
1* ~! {+ u2 i! l4 l1 `, G
2
# ?) n4 |6 J* G) z: p t3
$ T5 P7 A' M, N: \0 m/ O! S看一下训练集:8 |* l* }6 T" k% I* {* `
9 L" p' S) o! |) G; G! o
print(train_images.shape)
& p/ J1 @( ^9 N8 V& F8 j7 _7 ?print(train_labels.shape)& Q: C2 Y/ C$ c, A2 r
train_labels5 y' m- W1 Z- J4 ^$ E7 g
1
! W3 D) ^0 m: _6 z) z2
1 @: `) v# Z! F0 S3
1 z0 F8 c! U$ ]2 w输出:5 l# Q( s' e. s% j$ ~1 A
# V# W7 E# c6 q$ w0 h+ f(60000, 28, 28)& g( T! u0 c+ ^# z" x( u# @
(60000,): i- B5 |$ Z# g/ L/ s& t2 v
* O6 X/ j7 g" b7 P" R! Q, R! G- Barray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
, Z7 w+ [$ [; Q& ^' u7 \7 C8 A. O1
8 `3 e# y2 k" w/ X2
; t' ~! U! J, Q' h6 m5 D3
+ Q& I& e+ d. A t4
+ l$ e" z5 j) q& V. b这是测试集:! X0 U/ ?( k# Q& r8 u9 R, t9 S* @7 @. J
! P' I& a. C( a5 B1 d+ m Hprint(test_images.shape)
6 [2 w, {: s- Y8 mprint(test_labels.shape)7 _5 U1 K# n* }6 n+ H* h5 J6 b
test_labels$ {; }0 a& x1 k+ t
1$ c" g, Y) m' S" _" E
2
0 k; f. U& F6 p3
' t" D. P! ^% C1 e输出:
b6 x& j& Y& m* P
1 F" P" f" M+ E, I" x(10000, 28, 28)
" l+ E: L1 {% B(10000,)/ s! m( e4 q6 d4 s/ P2 J
V) v" z5 v0 X2 }array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
4 m$ _7 g* o5 c) `1
$ J7 v2 |' t7 }9 n6 E! H2% ? m2 |/ p' ]% M+ E2 \
3
$ v) {( C( ^* ?! j' Q. E4
+ d! f$ d7 `( N! L6 r. L网络构建
4 v% f7 W7 Y' o
x# m+ z+ k" `& A( F" ?我们来构建一个用来学习 MNIST 集的神经网络:: D3 o7 W: h7 S) _8 x3 F
, P$ }3 x, @* F9 o" I: pfrom tensorflow.keras import models# f6 e8 [6 \" J. u
from tensorflow.keras import layers
9 L0 ?/ p! p- [! h0 E! o; \% D/ w- Q7 A3 t2 x: }6 D( q
network = models.Sequential()
2 a o9 @. q/ g( d; P$ s6 ]# Jnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
3 ]6 E0 Y) F: l, y/ k8 D) Z2 Xnetwork.add(layers.Dense(10, activation='softmax'))* [3 X! L8 k9 @. c \) W& ^
1
" O, P: L% l0 t5 [7 V2
$ ]- J+ M. H; K5 u8 h8 b33 y: t- i! B' d, n( F4 K! ]" l
4
2 H4 U+ A% c7 y: a1 R* L* O5
8 T1 b: v1 n j8 ~: X6. U" l2 y0 o4 {* c# {- q
神经网络是一个个「层」组成的。
( R; X7 @- z& B$ h一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。 A2 a! \+ w: h1 ]2 @- k% T/ B
- r- C1 s& }/ R/ T$ i
这样一系列的「层」组合起来,像流水线一样对数据进行处理。! v" ] d; U1 i3 k1 M
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。5 ~! H% ]7 b; v# u; R) i& A: G
4 ]4 x4 | Z0 E' }' K
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
+ n0 Q$ t' }/ u: _9 ^, w
4 w0 i+ \, d5 s/ d数据到了最后一层(第二层),是一个 10路 的 softmax 层。, O( i4 e5 D1 x
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
3 M$ ?/ n, @- w6 [事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!! t6 f% f1 \( s# X8 |
: L& H( Q( F, s3 L编译
+ L- {8 X, |$ T6 k% O1 @, e& W. [4 i Y3 P4 J2 H
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
& }2 r k- L: z( \7 [
0 ?9 S0 n/ \; z; \" S+ D9 Q损失函数:评价你这网络表现的好不好的函数
7 g' p9 v" O* e2 m/ i6 l优化器:怎么更新(优化)你这个网络6 D- o$ W. ~' \- s6 U4 z, H
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
" ]" B+ F9 ^& u) Enetwork.compile(loss="categorical_crossentropy",6 z! V, b0 `& Z0 H
optimizer='rmsprop',
% H9 h/ g$ M- q0 ] metrics=['accuracy'])4 a4 F* _" M; s) U F: s+ H
19 V! r7 T! N* E8 N4 e; s& J
2
0 t) a" _& R' A2 ?- V3- b: }8 ?, N4 J( U
预处理
" t. z) {( L# v: @
0 K- t5 [: H# ?* y# W1 B图形处理8 S- T( |2 @( }# `- w5 H7 p
0 t6 @! p* V2 A) l w5 l我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
) x) [6 J( f2 u$ C6 ]4 O* n
# Y( w# _) H. ?& v1 e: b" z( A% cMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
5 V/ }; ?& _# Q! d而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。( l, s3 a/ K9 }$ v' I# C7 m
3 Z, y$ f- i8 d: b+ j. i/ N' Wtrain_images = train_images.reshape((60000, 28 * 28))
; q" t1 _+ B# B2 r5 M) {. Z ]train_images = train_images.astype('float32') / 255
: U1 R9 v) o0 k4 j. u. u/ ^
V& h9 i: [8 Q, V W" m( ?test_images = test_images.reshape((10000, 28 * 28))
! _1 {3 t) i* c" l) ^' C& Etest_images = test_images.astype('float32') / 255
2 K/ ]) Y8 Q# J, ?6 C6 m' c1
, h" @% {) l0 ^4 l5 ~2/ Z" S \+ c$ o L+ I" ]; a
3
# p5 E/ S9 c$ z9 u/ D {4
1 o7 i7 D/ n1 H- V5- E& a( C2 x* H' y K+ j
标签处理4 @) d4 ?3 [0 x
" _' t1 ?$ E- w7 ~
同样,标签也是需要处理一下的。/ m$ D- b7 v8 Y6 F4 G( L
& `& Q& g$ w9 P
from tensorflow.keras.utils import to_categorical
- C, B- e( |* H: s- ^' F" @/ ?% Q: k# X3 i' R* f. g
train_labels = to_categorical(train_labels)& f$ Q7 y, C( L3 p5 l7 \# Q
test_labels = to_categorical(test_labels)
2 {& A% Z$ T- b/ E$ ~4 |1' S8 e+ T; X* W* t( d( \3 u
2
4 |. E! A$ R2 [3 l2 Z: I3
% C3 ~/ l6 p% t' i: y4 O8 P, | g1 @1 V: X) T: E
训练网络
9 N# y7 T f" I1 K9 W ]: y, ~9 [8 I6 P5 D& C
network.fit(train_images, train_labels, epochs=5, batch_size=128)
- Y) f8 Y1 x- F* J' C* ?; O/ }8 ~1
6 R9 k/ W. A' r r( i输出:
5 S/ s& C, _# _9 G2 O h
2 W* j- W$ s# E9 d% Z) STrain on 60000 samples5 `% X, L. ~2 q, W8 B/ s- ]
Epoch 1/5
5 O. B+ X0 f) b' p, @) z* J- ?9 p$ D60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254, S9 _, D5 f! g' r0 s
Epoch 2/51 l5 b y, E+ L5 H$ x
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693' Q4 c6 Q# Z3 U/ x% t
Epoch 3/5
* M) K" m- L5 V9 }60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800; S- ^$ ?7 r7 ]
Epoch 4/53 d3 x0 f E6 F, e+ S7 Q/ L
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
! k8 R4 r w8 P8 q2 z+ v9 v# Z* sEpoch 5/5- \( D6 [: @, C
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
" ?, n/ {% h% ]' ^# P; q2 p( j9 ?9 u, P9 C2 m3 u8 s
<tensorflow.python.keras.callbacks.History at 0x13a7892d0>, Z0 D$ h. s1 n1 L2 x
1
2 o! f. b5 l; y" T6 k2 G6 z' e2
* }( Z7 ~0 _9 V* [3
! X, X- V& W- N# d! L4
' e9 g7 K' o' T" g5
1 l4 y' h* ~5 X- Y: S ]5 s6& p I O2 W+ o1 R/ t4 P i
7) X. ]% {' S. }( p* ^: K# C
8" {: C# Q f( L1 R5 H. p
9
i+ u$ ^1 a) p10
5 T* m9 E4 y7 W d, \- Z114 S0 ?, h" A, @& ?5 i; g
12
0 A2 L% }7 e$ J# q; k, R13
# i. p6 W& k! @可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
7 t$ \) F' _" F- ]! [" L$ Q- Z
# y* `, R" I" X- h再用测试集去试试:
/ A# Z- f' X/ J# ]) I
8 L$ @4 v! L8 {! Z% |, w* dtest_loss, test_acc = network.evaluate(test_images, test_labels, verbose=2) # verbose=2 to avoid a looooong progress bar that fills the screen with '='. https://github.com/tensorflow/tensorflow/issues/322867 C6 P! k- B: u1 B; P
print('test_acc:', test_acc)8 u8 k. M# T9 p: x" m
16 l: K! w; a |; ]$ c& ~
2$ I/ C8 F* X! E* X3 e4 w
输出:) [) U( e4 ^( ?% m3 T5 s8 d
3 ^/ i1 q! Y7 P. X4 K* W10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
6 ^5 d$ V. O8 k* J$ q8 F/ btest_acc: 0.9789
D& Z2 {- r5 W& F1
1 M( S8 c* }0 u$ y7 O2
3 _7 u$ A8 Z# i. E我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。; T9 @0 ?$ t* @/ c$ w* I# R. A
6 _$ k2 A8 [! y! L5 }神经网络的数据表示& M# E/ U2 i( C: ^
# k* V8 t1 M5 N8 S: ~ F% N) A) @
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。. }5 Q6 d2 ?% m, s, \% q
; ? @( q5 Q* \5 ~1 W
我们常把「张量的维度」说成「轴」。
( S. w3 I/ a0 p, [* v2 {/ m$ F' [% K
$ F3 l& F [0 y& @$ Z. V# ^认识张量
* _0 [: k; ]! f5 o
6 k3 J0 y# E! D% g0 J& L标量 (0D Tensors)* y5 A1 {2 ]$ L- c( i4 f
4 U7 e9 F+ k2 R! H0 {& N6 ]2 ?, AScalars,标量是 0 维的张量(0个轴),包含一个数。
2 m# Z. A) u% z1 {: v! e& G& S- V6 R i4 ?4 |! I% ~ o
标量在 numpy 中可以用 float32 或 float64 表示。
' [. S8 A9 }8 W: D$ }8 N; _, T `* U: C' `
import numpy as np
, t7 d J7 Q& z: [& u' Q/ P! Q3 \( D7 S8 I5 @: E
x = np.array(12)
; v6 H9 z! |/ y! X. ix
- }" H' t. O) q1 j- ]19 S" |1 ~9 m7 @: v+ m: W
2
- p4 v, g5 d a% G+ y38 j- V W0 v" O! A s: v
4* y- ~' P5 _1 z( C
输出:! A+ n. f$ C% l) ]6 E) S
5 O$ q+ ]8 z) C# j: R! {array(12)3 m( @- n; H8 M( j7 [$ W
12 \4 w) W9 N9 |9 N+ O
x.ndim # 轴数(维数)+ r" C8 h5 z0 h2 {& c
1' h. B0 i3 F: n" i3 M7 X: l
输出:
& M$ F' [7 ?* c; D
$ l( }! ^/ R; O7 N: ]# S- T* k% g1
" C% y; \4 ]3 t- V _& C& W1
7 E: m, U0 A; `, T" p0 m* j h向量 (1D Tensors)6 M& o/ D }' {$ Z1 }: e5 U Q
* T7 s5 H6 `% R/ e8 D
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
# K- }: T; d& p1 E: N" I) {
+ ^- N3 b& l, f* |9 J" Ex = np.array([1, 2, 3, 4, 5])# ]. d# V7 o0 Q/ l* u
x
9 F$ J( ~. u I+ ~/ W+ A A1% F' |+ t' n) f
2# X- s" e3 t! Q9 u1 P; z& k
输出:" k3 s* _7 ]) N, h) i1 [
+ K4 d& t, Y2 _1 O5 I
array([1, 2, 3, 4, 5])* h+ L' ^9 B6 q) ]1 `5 @
1
6 J0 K1 R; }7 G l. o) v' Cx.ndim
: l* U |0 w+ G l9 `1
7 w& c% ?, H/ N/ D" F; ^! F# y输出:
, k2 k* P$ o, z# b. Z! \( L- d
; f; x9 ]% d0 D. Q/ k6 C1
A" Z& z6 F# ~: Y1$ Q6 ^' B6 R6 Y
我们把这样有5个元素的向量叫做“5维向量”。6 R0 Z: S6 I. |# ~- \
但注意5D向量可不是5D张量!9 i: t5 q3 }0 e) `; Y/ l4 P
# z' v) y, k/ W5 j5D向量:只有1个轴,在这个轴上有5个维度。3 j# `5 k. o4 b4 P
5D张量:有5个轴,在每个轴上可以有任意维度。
6 J# s! E1 U# L6 j& b3 D w* G这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。2 }2 x5 [. t9 ^, E8 y- c
# \4 y, ^- |% N3 e
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
; b, t7 k+ Z1 j0 |
5 Q0 ]% K+ R9 q) Q矩阵 (2D Tensors)
) u' F+ Q; Z: i3 j* t
/ n `& S8 Q3 @7 R5 QMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
i$ P; p+ J0 K2 t* Y. O
2 c, _, [+ a4 Z8 N+ e& xx = np.array([[5, 78, 2, 34, 0],
/ h: F6 w$ D' q- Z( n) ^ [6, 79, 3, 35, 1],
& H' v+ u) m; h- n1 E [7, 80, 4, 36, 2]])
' P& k# p. M: Yx
9 E4 A/ }& r3 z0 g6 J; ^' m% M0 Y14 A# q; S# Z# p5 q
2
@$ j. U9 m2 o' T& F3
4 c% r! H: W: z }& E p- f4) z/ I5 h4 W) m' S
输出:; b0 ]* X5 |9 _" n
, R" a+ g" o6 [( A0 W! C7 K: Rarray([[ 5, 78, 2, 34, 0],
# n/ ?/ J5 Y# V [ 6, 79, 3, 35, 1],1 ?% [2 N0 s. m Q
[ 7, 80, 4, 36, 2]])$ [* \5 e8 H2 t" ]
14 c! }3 a' U3 p) _5 t9 ?* x
21 k( r+ R# G2 w1 r- q( l
3
& z0 O J% t* S% F, I/ V2 Bx.ndim5 O( b- L- t/ E4 A5 t/ T# G9 M
1: S# M) ^3 X( s& }1 Y
输出:! [! ~% W* `7 N. t% ]( S
2 \; x$ o5 w T# s$ `) j, ?; w. X
2
+ d0 Y" ?2 y; x0 }* s2 V1
6 A/ a# g$ E1 f- b) a8 f( X0 o高阶张量. |0 q7 \+ A; J2 c7 e ]6 y
4 {# o8 _4 O/ k! E
你搞个装矩阵的 array 就得到了3阶张量。5 D% v2 [" X# T6 U0 m
: z* o2 I% e0 W/ r' o+ y8 p
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
9 l( U7 u+ [# [& P) k$ S7 q6 d
& {9 P' U' W2 a) m( zx = np.array([[[5, 78, 2, 34, 0],
! O" Y0 \* T2 V$ w9 H [6, 79, 3, 35, 1],. \/ @$ B% s* p0 f
[7, 80, 4, 36, 2]], J. Z+ F2 M3 q! T# N2 v) y" I4 h
[[5, 78, 2, 34, 0],. N* g& z) V# u5 H0 Q, e2 u( W
[6, 79, 3, 35, 1],
5 f& J1 W2 d: q; |% T7 ~: j6 e [7, 80, 4, 36, 2]],
( `( s3 V) J2 P9 _, C( V [[5, 78, 2, 34, 0],3 Q* H- ?. d# C
[6, 79, 3, 35, 1], L8 q4 Y, P) j
[7, 80, 4, 36, 2]]])
* B6 i# Q9 U& i: j, vx.ndim" r# `" H2 E9 n& _
1% e1 k8 f6 m, o# |! x6 X, u6 L
2/ e; O4 \5 l4 X. {
3
9 f. y3 h5 M9 _( V- X5 W% h4
% _5 H8 |7 o$ N z9 j5
3 c0 \. t* q% b/ P( u1 l$ A6
& _5 `3 a3 y: b) O) J- J7) s) d# N* x. Y9 P0 {
80 M/ \, w' o9 a+ N
9
, N( R+ e) E4 X" w7 `# T103 V; r; r. q' W. H
输出:1 G* e ~0 m* k9 {6 Z
% [+ P) z8 E% u( L
3 f+ _# X7 {; [
1+ w( d5 \4 o, ?. c
深度学习里,我们一般就用0~4阶的张量。
2 [& U/ f2 y$ H P6 D |; |/ E& l
o9 V5 r" ~( j% c6 m( x) [张量的三要素3 r9 U% f) y' r- S" c
0 f1 [7 Z, {' ^ n8 a
阶数(轴的个数):3,5,…6 u, q4 `1 q( ?; o3 Y" x$ v. o) Z+ ]. k
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…/ |9 ]0 c, h' ~8 R0 o. _
数据类型:float32,uint8,…
! L V0 R" `7 p* n4 F0 N我们来看看 MNIST 里的张量数据:
# A. A1 Q( ^; x2 D5 E
+ N* t4 q2 r, `from tensorflow.keras.datasets import mnist
& c: D) Y* Z" [2 ~8 s(train_images, train_labels), (test_images, test_labels) = mnist.load_data(), _0 ~5 ]( A5 J5 ~: w/ V
6 L; `5 x/ a) j/ ~/ B, D
print(train_images.ndim)
( i1 S3 n$ c0 g# |" m- o! ]print(train_images.shape)- R- X1 q T! [' `0 G# m& A1 L# ^
print(train_images.dtype)
) W8 z& X3 y8 o- v$ v/ J12 g0 K$ p% [% S' P2 W
2
: Y) b" N4 U2 L0 p# ]. x* v37 I5 E/ s1 P, W9 k1 n
4
. i0 F4 p$ ~. }2 u; v54 w6 N9 o* |7 {& ~& i' c. |
6
( L4 Z( k. Y0 _" ?& q5 v1 z U输出:
" X% g" E* S! m S7 v1 y& ]; ~9 k: r2 ^3 v. m, P9 i+ r
3
0 K+ F* l0 \6 t9 t: V( Y9 x! Q(60000, 28, 28)
) n; J8 U9 m: o* euint8
& m) _; d9 t v# V) j1
# W' c. w$ }+ H' F+ z* b4 Q$ ^8 N( w, p2
6 z: E+ u% Q" [" G$ c4 V+ o7 u: {35 z* S7 p2 P: S9 p
所以 train_images 是个8位无符号整数的3阶张量。
. @) [2 c& h2 U1 L% u& u4 Q7 a6 N) N* o" ^3 X
打印个里面的图片看看:, c. e0 W7 y, c3 i, e
/ M0 k7 j9 F t. }. _1 N5 ~digit = train_images[0]
" R2 o/ g( @( C; Q5 Z$ z- k- g# a* ~5 a; M* |& j
import matplotlib.pyplot as plt9 N U: N) T( _0 [7 J
6 O/ T7 o7 n# z. t: k: bprint("image:")) Z. x9 m* q( g# T) y3 x; q! w; E$ }
plt.imshow(digit, cmap=plt.cm.binary)7 p4 E7 I, u7 Z+ P+ S
plt.show()5 ~) j1 W! u8 `/ W( H! m
print("label: ", train_labels[0])# T7 j) p, O; I& ^: K
1
7 B+ ^" I, o) ~: J$ I2
7 ?) D) F% n) i0 i9 q3
$ C1 o& l+ x C2 v3 P4 J1 y7 @* r: c1 w( r4 F& q, |
5
6 ^7 ], y! J g& v63 o: x# H g- @5 u/ y7 T' h
7
6 m4 j5 z7 F3 `8
, Z# i, ]& A9 }: k3 P. I! B输出:$ `( h2 L C, H( Q
% O, S- c" d; X' r+ z% G, \( X3 B/ U
9 a5 o: H( O% J4 Y' J! K5 i$ l8 H* F
% P: o$ V5 L4 x2 z
label: 5
9 O6 R T* \' D4 F3 J1
2 O2 j& U9 V7 R$ vNumpy张量操作
% ] q" ?- b6 ~7 U
9 z+ n# p) G) T张量切片:$ t# N/ t/ b, p8 H( B9 A; {
T) S$ N8 e2 q- B2 J5 c
my_slice = train_images[10:100]
1 v) k9 X$ A! m0 d6 Tprint(my_slice.shape)( [& C9 f/ V! m/ J2 J' x0 t
1
3 r- D8 l7 A# K- W, Z2. f- F7 [7 g5 n5 t' T3 I2 ]( U* v7 o
输出:
2 ^8 a/ v5 \' T6 J. P- j3 ~
" n1 @% M" E; p$ ^9 m7 x* ~1 X' l(90, 28, 28)
/ T( C- t6 C: q; B0 o: { f16 }3 d2 A5 O$ A6 A, J
等价于:5 ~/ S- v: t& D1 \0 `) {: E
2 j9 J# n" C8 i' j& K
my_slice = train_images[10:100, :, :]. i/ p4 v& `- Z _' U- f6 |' s
print(my_slice.shape)" C" y c# X2 \) B
12 o2 p9 _3 [! P' i' O
2' o& b* k6 B5 V: O& B
输出:% d8 i3 r. F$ b8 F. o1 q
" _. J' x' S6 F8 U+ ]$ c$ T
(90, 28, 28)
2 \% C2 F+ M9 c% Y1* x& x" C% s. ^% v+ o, d' v5 t; h
也等价于
$ K# Y( L% p1 G. e) H. S6 {, {8 ]% i4 w7 g
my_slice = train_images[10:100, 0:28, 0:28]% W( P" C7 F) f0 Z7 l/ u4 ~
print(my_slice.shape), u3 J: C7 X. X6 h
19 v0 [; j i/ i
2* y) S2 S# q* G% G: }
输出:+ R" {$ `5 q$ ^$ g5 J. g* M
& q H: k! V; ?6 M5 o) I0 O1 h. W
(90, 28, 28)2 m; I$ f1 k5 D" U( t( v( X6 I
1/ I5 N+ M" a u0 j1 v, S$ M
选出 右下角 14x14 的:
3 Z* g+ R; \# C5 ~0 g% Z* K% d3 R
0 ]$ f6 W, Z- @1 k; H0 g5 z' xmy_slice = train_images[:, 14:, 14:]
8 e8 f2 c# J' u" n/ m* p7 ]% dplt.imshow(my_slice[0], cmap=plt.cm.binary)& ?( ^$ E% N/ R1 v. i
plt.show()
0 i% U9 e+ B5 p# ]1
* o$ i% n' X/ z: k( G. ]/ q2
; S2 w1 v, F: n3 t3
p. {* j- U/ A q" H" m输出:% m: H) }1 j; N6 |" H0 H( z
6 ^/ v/ { U0 N6 Q6 s# g% S% k/ [( [0 |. W. {& q# B9 o
( d$ T# Y* X R0 a5 r
选出 中心处 14x14 的:" K$ H$ q7 W2 h: x8 l% h
6 z7 u' W! u jmy_slice = train_images[:, 7:-7, 7:-7]
1 o2 a7 T. {' O; ? r; _; zplt.imshow(my_slice[0], cmap=plt.cm.binary)
5 o; Z8 I& K; vplt.show()
) z* l- V x9 u8 Z! \: n11 e. O* a) |* o% E
2& v8 e( W) J. C
3
5 c2 v( O# {$ _' C) ?输出:
* \9 g! l2 }; {# W5 B0 {6 {1 c z( _3 G m3 W( L7 K* a% h+ K
& f' ]' `0 o* A6 F% S
: z2 C2 r7 L3 g' H+ m数据批量
! v5 q+ m7 S+ \2 R5 p3 ^, n- @. w7 c- ~& V3 x) S: j3 v
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。$ F7 r' Z5 v# d8 j, q# O
; a0 O6 z6 j6 C% g
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。 X/ B! F6 w+ t0 t! j$ q
! y, b4 b2 j3 P6 r8 }, U
在 MNIST 中,我们的一个批量是 128 个数据:: C% a# L r' f# C/ k/ }
/ a& j7 T8 x: O- s
# 第一批
9 @2 b: _1 M& p- d8 C6 U% _batch = train_images[:128]3 n1 z, a4 Z ?( `# x7 C/ A
# 第二批1 y/ [0 m$ o: C5 ^( `* v9 \: y. L
batch = train_images[128:256]
. h3 w" w* `5 H- w/ L# 第n批, `3 H2 P0 w* f5 t" a& T( [
n = 12
6 i1 L, x1 ^0 [5 D. P3 d" zbatch = train_images[128 * n : 128 * (n+1)]7 Z/ z! R p3 W- j' D6 R K% C
17 \6 E9 r2 p. m( j+ n* n q
2+ W& I' n0 g4 ?/ w: [ [
3
0 T1 x% [0 Y0 a, v/ J J4( H2 l ]* N! P/ O# d. P, U
5
% z* U- A( C/ n( [6
T9 \9 f F; U6 ]3 w9 q( {7 h' ]75 C& ~5 j% c' Y, e
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
* V" S5 w9 O- d- }/ m& n% w4 v8 F, P: v2 x0 e6 ]+ I" q! F, P9 P
常见数据张量表示- h$ P- l: o' ^9 Z& ^% }
- L/ v1 k9 |) \9 w数据
8 p4 y/ W9 R* |* t1 U) j |
zan
|