- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563382 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174237
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
; h& g" z" r! p% `' yPython深度学习之初窥神经网络) x; v( A: Z1 c9 C6 y# U, s
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
% i1 W8 F9 w2 W/ ]7 d* ~+ d
/ p# d" q4 N3 @7 g- W本文目录: v; H2 G& S# U- v. L0 F0 X8 ^
- u( A. |0 ]9 O3 T. T3 e6 T2 o文章目录1 m1 Y! q f5 r0 ~/ ~- P7 D c
9 [( O+ J$ ~" W2 Z& j
Deep Learning with Python
) {& C* f/ S" u" b初窥神经网络
* p9 H E( k) P$ {' J, o导入MNIST数据集2 M2 p8 L2 p1 v' x4 ?2 E3 M
网络构建
8 S8 Z- c/ C) P' q% a1 w6 [$ R: _编译4 r- p: x4 U8 s; T( P
预处理1 P% r& R5 ?, q, {+ R
图形处理
' k9 I9 u/ u5 ?0 R4 i1 y5 E I" f: P标签处理
- j/ l, a5 n( \) r7 D: L训练网络
% C& a$ z$ S8 Q7 w% e9 U* z神经网络的数据表示
* Y7 I5 d. O# o( q5 L1 H8 h% m认识张量' _5 \( s6 m6 X$ C& x+ ?
标量 (0D Tensors)
4 \. y+ y1 c$ ?, D% F( j向量 (1D Tensors)
. l0 v6 a/ L8 y, Q矩阵 (2D Tensors)
6 ~1 |/ Y( u& b& `/ A高阶张量9 s' E1 B3 f% _# E& u
张量的三要素/ F: b3 y/ \" n% s+ D" K
Numpy张量操作, e# [5 Y& w( X2 @ y* F
张量切片:
0 g2 A+ c0 @' a0 p k数据批量
4 t% ~5 N# |& a( k! Y/ M2 O常见数据张量表示* a1 { x/ U; u# V
神经网络的“齿轮”: 张量运算( u+ S; L+ r0 g( J- k/ V5 z( g$ V4 d
逐元素操作(Element-wise)1 S9 s5 ]) h$ K. @# d+ Q
广播(Broadcasting)8 T( `$ } k7 S( b) a
张量点积(dot); C: W( ^" h( x9 g; a/ Q$ u
张量变形(reshaping)6 S( R: p% ~% [# h: }8 b; l* E
神经网络的“引擎”: 基于梯度的优化
! d+ t. v: n! Z6 q9 m i* V导数(derivative)% a- t+ w+ g7 w1 r, ?; a: n+ R
梯度(gradient)
# m$ v2 C; w' G" O5 z/ }0 c随机梯度下降(Stochastic gradient descent)
/ L& S6 q, d$ ?1 z反向传播算法:链式求导, h+ O0 m s. a" t h ?! ^* L
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。2 T! A+ }/ _# C% x7 d2 K
# S& w. g/ F; M/ f: k& S初窥神经网络
5 e$ d, A5 _; M9 ]9 d! K' f- [" X+ z& @
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。9 O7 i/ ?( ~, H& o: k
( E* A e7 N: `) m5 ^" ~" d, FMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
9 _( @ C* P& J/ N9 i y/ f" e0 C3 o4 K; ]. I3 S0 E' ^
导入MNIST数据集
( C- F# v- \$ ^/ t5 ^9 S9 l7 r/ W$ P/ G% B
# Loading the MNIST dataset in Keras* A; _3 C- _4 v! s
from tensorflow.keras.datasets import mnist
+ M) U7 ~: k9 S' A9 a3 k(train_images, train_labels), (test_images, test_labels) = mnist.load_data()7 w& V# ~3 h( p1 Q: \& c" w
1' }5 b. S8 Y! R. l, `4 z8 A
2
" B0 A. p6 f3 j: r3 w3* n% `0 C; l7 w/ \# Q4 }; `
看一下训练集:
8 n6 X! I- i9 y# P5 ^/ J/ E3 q' l- ]" V1 V3 {
print(train_images.shape)6 V4 C6 O( r! U( r) L
print(train_labels.shape)
# ?$ `5 w6 d/ i% f3 H+ Atrain_labels
1 J u j; T- G' j8 n) g) ~11 y) ?: R) B1 D: T
2* u& H9 E3 g, _1 }$ i* F
3- n6 R* |8 y! ^' }# H
输出:* V5 u1 U% `: K0 t; \# F8 C0 h
0 c3 d* k/ O. K2 }6 R
(60000, 28, 28)
' P0 P3 k- r7 D$ O(60000,)& h% R j/ i" G- q
$ K1 K( R. v! d' carray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)5 Q7 }( C; I2 X2 W: `# u" e
1! g8 v5 r2 L7 p( B7 M
2
, n& q" S) Q+ @( O3
) k- [" X/ y; q/ R5 E4
& k# a) Z; o1 ?( q! B这是测试集:% T. r; G4 W! x/ E' [9 _0 d* H
6 \. l% X& c7 Q( }* ]print(test_images.shape)/ o+ J, R) S0 g G1 a8 I$ M3 w
print(test_labels.shape)
O, q z4 Q* X) l$ T9 z% G* \test_labels
* W) U W5 E& m; {15 |% i4 j/ Q) [+ b( k: _" Z
2
" Q! _* b& E8 k" G$ t: r) ]38 X8 W: k |, p" c' j6 p% K$ a4 z" t
输出:
. Y i& a) M' b% L- T$ }$ q4 k& O* N2 q5 z+ t3 `0 a- O
(10000, 28, 28)$ u; P1 Y5 u) e
(10000,)( e; H4 Y/ w- i0 V- T
+ l3 M* V z- G7 M4 e5 P& V9 s" T2 e
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)" o. X" h$ L7 } I' Y
1
( r4 u* r1 m1 {6 i2" ?& N2 W- h- ~2 {' \4 L3 q: J) _
34 j; Z) H. ^& z0 O) P% p
4
M/ z3 y5 {5 u! k: F# \, |网络构建
1 M% _# ^$ {, d8 {6 Q! a7 `
! b6 H* A2 f7 w) C+ L我们来构建一个用来学习 MNIST 集的神经网络:
! Z' P' {6 q! S) Z6 h& d- u7 J( w
# ]) U0 `/ t& Afrom tensorflow.keras import models; U- E- c+ w* K/ t9 d- ^7 R
from tensorflow.keras import layers1 g9 M- K; h0 H4 H( p; A
( n, a! q5 x' [6 Cnetwork = models.Sequential()6 B' _. z! v& c7 @& Y/ P0 j/ [
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
1 @; @5 [1 M: f1 N* ~network.add(layers.Dense(10, activation='softmax'))
* f m' y8 b" E1 V2 M1
) i* N- i/ z) i2
' P$ M: z% P- y2 v# H( H3) w/ z5 a9 }* v( {1 W! p
4
' V: E6 }& F3 w7 K5 k: w: U$ H5" V' \4 N5 G" c, Q. W% ~" z# h4 c
6
: n$ F$ g3 b Q神经网络是一个个「层」组成的。
% L' ]/ {) B! g, d) `一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
- P7 ]+ @ e& n; {) T9 Z
- z5 W1 B2 F3 r. v6 F+ S这样一系列的「层」组合起来,像流水线一样对数据进行处理。# ]( Q. f5 J6 O; V6 Z% O3 K
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
; s9 Y/ z, p' }' V" m; x
, m) S: U0 V8 R& q0 F我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
w5 q$ q Q& C2 v( p& Y* O
2 J% N1 X7 a0 ]* i$ p0 G2 H数据到了最后一层(第二层),是一个 10路 的 softmax 层。/ H: e1 ]: y; j: y6 X. E6 Z/ u
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。2 z* n$ g9 k5 S7 k# g) f" d
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
r* N }0 X% |4 [* V0 v" A5 C8 Y" D, a$ ]/ \ C
编译) S }! g6 U; b9 @( J! q! O
' v* ^% g( _. @8 f2 }接下来,我们要 编译 这个网络,这个步骤需要给3个参数:( X/ `+ r) y4 [$ R/ e, _* c
# b- S; _# {0 e9 @) y2 F6 \
损失函数:评价你这网络表现的好不好的函数; q6 w, b0 [' D; t" a9 K1 m
优化器:怎么更新(优化)你这个网络/ R9 B3 U) z0 L8 }9 _
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度& \- s* ~9 y, G, U+ z
network.compile(loss="categorical_crossentropy",* \0 K7 X8 g+ L
optimizer='rmsprop',, l$ r8 i i% E& x
metrics=['accuracy'])/ d: s. t$ @3 _4 X! U" S& x
11 [- f; j* ~- h) b. R$ n' {
2
, Y& }0 J" P, ?3* V, p7 m9 w+ i4 \5 H
预处理# G# M) f" K# X: m1 |
) G2 ?4 f& l8 M& g
图形处理
% F0 E$ X; Q4 W) q2 D4 F' \. B! M. m$ a9 E* E1 C
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
$ ?3 O* i9 p+ K- B' n3 y0 Q; n E- ]9 F0 w4 o
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
, v4 ?% p: g4 d* \) B" L而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
: h0 t3 R* h% T0 Q
/ Z% H( p1 u" M, o/ M( Ktrain_images = train_images.reshape((60000, 28 * 28))! P/ a+ U% i' C- E0 \0 h
train_images = train_images.astype('float32') / 255
; c! i4 c/ S" B* n' X3 U9 K& @7 t# u1 E$ P D) m+ l) E
test_images = test_images.reshape((10000, 28 * 28))9 {( }- K7 m8 k5 L$ L
test_images = test_images.astype('float32') / 255; p) R/ q; ~8 M5 H3 @' R Y
1
" ^4 R* Z% _' D0 l) J5 f& r1 O7 Q2
T6 |) c8 \1 Y2 ^4 y2 H& p37 C- R- T* d! ~ E
4
1 n) J/ U% Z9 \) [, L9 \5
% F# w1 t2 x) T3 ~( h+ \# \标签处理
( i5 D1 ]/ l) m1 e6 {$ L3 v$ |0 `' j) ?, r
同样,标签也是需要处理一下的。. I: _' q+ U" e1 R+ Q. f
# R; h. O& e, t% b. Mfrom tensorflow.keras.utils import to_categorical
$ F% V! p+ [9 D6 @% v
5 e |* @$ m5 {" y1 X4 rtrain_labels = to_categorical(train_labels)
/ q/ u D% B' Z5 ^7 l4 \5 ?test_labels = to_categorical(test_labels)* j$ I, g1 s1 ~+ i. j/ I
1! [4 C& P4 H7 z' ?
2/ n: U3 `5 ~( \$ T3 o4 \) ^0 x
3# z- M/ S+ ]/ ?
4
8 I& K+ k0 e$ E2 W* c: k+ @训练网络
; _3 G% e; y$ j3 g( i0 ?( Y" e2 l; ]% o, ^8 g
network.fit(train_images, train_labels, epochs=5, batch_size=128)& `7 V: E) C9 {
1) C1 C e$ W8 k+ |4 z+ R- x
输出:
, r- Q5 N5 {. y5 g5 s2 n/ y8 A k' ~& {! n9 ?5 e) v; B. Y
Train on 60000 samples" d/ F/ m3 F8 [7 o
Epoch 1/59 q3 U4 ^$ u! `2 K) d" O8 m
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254( [) a4 `2 e D0 I% u9 h5 [5 r% z
Epoch 2/5
2 C$ _( x, p2 u# l# {/ k60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693' [* i9 h; W( m5 t% V, f/ ~
Epoch 3/52 [5 p: I# V) Z/ Z- `/ s( F
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
& y+ P+ B/ i+ U0 M# R5 ?Epoch 4/5
4 q1 I$ q; x' C9 s& J7 l60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848- j+ ^( A8 C' Q! M
Epoch 5/5
; Z" a1 a5 ?8 }. s3 G2 ~60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
( @% e$ E! u) `+ |% F( S/ g, S5 T: }; R4 r: _6 o) k1 V# s
<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
6 r+ U; y9 u" v17 T, W4 w/ X0 n
20 ]7 r5 X+ J4 b, \2 l
33 u9 @/ h( d( y# j! q9 v' }
4
, ~, P# f' x! e" `5( O/ C6 m/ k3 ?! m, w( R% h
6
0 `0 ]3 A; o. B' x) |( A7
# i5 d) v }# r; }8
8 _. l2 B2 ? ~- }9
( F6 N4 Y" B# N* f9 S105 u/ k4 \' r* y) ?
11
+ S8 |" ^7 `2 L12
; o( J `; c% b/ p13
" `: ~4 B5 U6 @0 L% c可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。& s+ V! q2 ]5 u. r, o) I2 b
6 Z; l4 Y8 w- I0 s7 e/ J0 s
再用测试集去试试:; p8 X7 Q% Z5 r& z1 ]* V9 t$ N. f; N
8 r! d/ N+ T) R: m z
test_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/32286
) n* A* M9 Q1 b7 I/ qprint('test_acc:', test_acc)2 Y3 M' { e5 J
1 O- @( U, W" x# I4 Z3 T
2" H O6 p: F9 a2 b
输出:
# w6 A3 \# M$ A* V
3 }. Z8 M+ p3 a$ t" t10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
& n) {+ s: b1 q8 t0 |' Ftest_acc: 0.9789& ~& z5 h( D; k
15 i2 q) B: ~/ U" ?6 D% D; ^
2
% h+ `" y6 J/ I5 O G9 a& \我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
2 u$ M G( X5 {1 L$ Y. N5 ^ Z$ r( j8 ?4 |4 [* l" Y( X
神经网络的数据表示
5 Q1 H: r; z; i6 S$ U; s @6 [0 G S D6 b9 O3 ?
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。6 E# q+ @1 C. W
& l6 `) L% r# X% B. Z: C; b/ e我们常把「张量的维度」说成「轴」。( @" B! @4 O" _1 z
8 Z1 D$ |/ g( H: O5 B2 ]
认识张量& x: ^4 u& k7 J8 S/ n
; U6 z+ v3 j% w; Y
标量 (0D Tensors)
" a, C5 G, e0 W# L, L9 y
( O4 n/ F/ n( l" }2 xScalars,标量是 0 维的张量(0个轴),包含一个数。
* P$ R% E Z1 d$ [# W6 Z8 ~
9 W$ Y- d+ Z: A. I; W' \标量在 numpy 中可以用 float32 或 float64 表示。7 b. Z8 p" B8 J2 m# i8 ~
- q7 K$ b2 |( U$ G$ U$ n4 j' ?7 _import numpy as np
- y7 O1 T+ B, C' h& Q2 R
( u6 |1 Y1 B8 e/ Xx = np.array(12)
$ K& P9 \# |; b+ Ix
\' Q: ~% D3 K4 h' ?* X$ i) ]& i14 v: I7 ]9 J4 K3 `# m: l! M) q. [% s1 i
2
! X3 Y9 ?* W. d" n9 p3$ [: K3 |$ t( H6 f0 ?2 R5 h
4
& B4 Y; b _% B2 G3 m7 u. |* d输出:
' f2 |' I; R/ g, }- [
6 O' P! r" r/ k( b/ T, varray(12)7 S) o' g* Z& c _& p% H* G
1
$ [* x* i% q. H6 p1 t3 ix.ndim # 轴数(维数)
7 X ^9 A/ U% s4 y' R19 g) U* T% a7 m) G9 w. I
输出:
; e7 A: S1 r) g5 R% U1 e' L
- g4 ~' p G6 f8 P, {0 y( X1& K6 t: k6 A# N. \: i+ ~
10 Q' w( ~) ]+ M8 i6 c9 `* O
向量 (1D Tensors)
- G' V% j/ e' |' O
7 G2 q, ^) O4 \8 C: k0 r5 _Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
2 }7 t4 U6 B( v5 t: k% P
5 M8 G; ^, j# x& U( Ux = np.array([1, 2, 3, 4, 5])
4 o0 t" s$ V3 `! k! v# Gx
1 t" `' x# S0 n- R2 C1
. c+ u, ?# Y. w, B7 t$ L28 r7 Y5 K2 L8 I- s! c9 V0 i
输出:
7 I: F/ _: ?/ l( [) X4 i- H. I7 z2 j: V
array([1, 2, 3, 4, 5])
7 T0 j6 V( R) U$ O+ i- J11 i$ e9 h* V. p
x.ndim
; A; g: ^$ J" J. x" n1, p& J+ P3 E; Q6 o8 ], A% ]
输出:. u3 e# z2 G! N2 I
5 d0 s \$ f( C# ]1
$ B' ~* ]7 L& g( x- Z( V17 @8 n! [; `4 r
我们把这样有5个元素的向量叫做“5维向量”。. F/ {, n) V% F3 B1 M' x3 H1 \
但注意5D向量可不是5D张量!
9 F9 n& P: r9 D2 w7 q( x* K% H# c/ G# {1 w
5D向量:只有1个轴,在这个轴上有5个维度。4 `& s- W8 W2 c& n
5D张量:有5个轴,在每个轴上可以有任意维度。
+ z6 d* ?" { Z这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。& w% D Q4 D& w
' m, P8 U+ | [
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
7 ~) k1 ?. n1 [! _9 B; v
. \# B8 o' M. G6 z# K- v% [# j矩阵 (2D Tensors)8 _% I7 R2 `- I6 k6 c9 R+ F
! N4 ~4 P( ^3 {$ l, b/ _5 fMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。, _* H. V% u y- H6 B% \% \9 r1 R& l
- B* [( s4 z. ]) ?# Z6 sx = np.array([[5, 78, 2, 34, 0],7 m$ Y. J. Y+ M2 h$ z) S8 S
[6, 79, 3, 35, 1],
5 S# N: y, B* z r [7, 80, 4, 36, 2]]); P4 W' S! k( _
x1 t! @0 C% p# F
1
: \. m/ u, T) \3 t r# j# x2
# I8 J: L Y* M! K0 U: V: @3
, m" X7 ~/ Y: I9 [: r4
8 @- z+ b7 q" `输出:( Z0 m6 ?: J9 @) k; [% `
+ v! v0 q, N7 X N/ A. a! a
array([[ 5, 78, 2, 34, 0],
4 B/ n7 P S# F; C0 [ u [ 6, 79, 3, 35, 1],3 n4 j1 L7 K- q4 }
[ 7, 80, 4, 36, 2]])
& s1 H5 W5 V1 |0 ^& L$ L1
" R% I0 e% u0 N2 T6 W5 i' t$ B2
9 a9 w$ B; J7 O36 w( G0 L5 p1 L4 M( H( C
x.ndim7 R/ h: z; p6 m" K: G- p% q$ A
15 q2 t* L1 m% [8 i+ i/ J/ h
输出:
, i8 S4 C: m' l) j, i# P2 N4 c; z" f" l5 n0 n% p$ J& N: }
2
' @8 r; W5 g: m; I16 c4 T- H$ `' W. q! P9 j
高阶张量
D0 p( U' E) n7 f' V2 \7 r
" P8 |- I/ H* H8 ?; ~ i; f你搞个装矩阵的 array 就得到了3阶张量。
' ]: {- a ~+ v4 x+ Z* ?. C4 q: Z N' h4 j C: y% ^& X
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。6 } N. R) s6 ]' y+ U
5 O( `. V2 h f& b" F# d
x = np.array([[[5, 78, 2, 34, 0],; U6 n) {/ L, A- Y& ?
[6, 79, 3, 35, 1], D0 }9 M0 u+ f* W1 E
[7, 80, 4, 36, 2]],
5 S6 L. {$ E" y) j( H6 i1 R* e& Q: a [[5, 78, 2, 34, 0], n$ r; e1 ^0 f ^- v
[6, 79, 3, 35, 1],. h ~" s6 ]6 ~$ z, E* Q; z
[7, 80, 4, 36, 2]],
0 M3 q( \+ Q& f+ {$ c" q [[5, 78, 2, 34, 0],
5 G* P, `# W/ a; U0 G [6, 79, 3, 35, 1],
* v8 |7 Z, `- ?0 u+ ?. O( |' r [7, 80, 4, 36, 2]]])
% C2 H* k8 ~3 s( F' ^" j" J3 M* F {x.ndim6 j8 ~' ?9 C6 }
1
- l9 ?: }1 D( z, L2 \- T2 `2
- U/ q7 k$ R& D3 y+ K3/ k1 b: n9 m# l/ Z1 L5 {& c
4
1 P7 l7 S3 |& h5
: o( G7 {# X; f, V$ _7 c y% B) h0 t6
! u& ]' l9 M" u" u, M1 ^7' C+ l3 f5 x8 V
8: T! _5 _* S. \1 }/ j7 Z
9
7 G# W, _! H' Y2 g10
0 N) \5 \. \% Z输出:' {5 w8 Q0 {) ]8 ^8 b
' U% D' b* B! i3 ^
3
8 g( G7 r% q1 d+ x* B) x1: W* I. b+ K: U' E
深度学习里,我们一般就用0~4阶的张量。0 B9 l0 K" g% Q$ I' p
: k! `6 Y' U- D: T) r( d, f
张量的三要素( A" g9 K3 i1 a {" }4 h. w* ~
8 L- K# `" A. q4 m& I
阶数(轴的个数):3,5,…
- v/ H! d0 R* Q- C$ ~' l+ V" x形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…7 S7 n. @) \" \9 m7 M9 }
数据类型:float32,uint8,…* m( i1 Q) \6 m8 L
我们来看看 MNIST 里的张量数据:
. n$ e" c2 ?3 p
6 x7 \+ V% D: |8 ^. _; f! B: Hfrom tensorflow.keras.datasets import mnist: C3 Z7 B' ^. x1 N
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()+ R! g, [1 _0 u9 b; M. t2 Q) K+ P4 @
, L- t& z3 r, q6 @
print(train_images.ndim)
$ @0 w+ i: o, b7 @% U3 M k. \9 \print(train_images.shape)
( w$ s4 q1 u kprint(train_images.dtype)
7 T# O1 L( ]3 Q1
1 ~, Y% _& R* G# U! e8 y( |25 x) P* B6 g/ g5 E$ u
3
2 U2 K4 G. i* |+ g2 \3 W4' e9 M& s6 O8 x/ G- _" o$ V
5: J# q& M+ P( r1 L, d% H
6
/ X# e8 c$ z% \( ] l$ a0 E# G* V输出:
1 W6 q; u9 w9 y! {' ~) F2 E
, @5 o" Z3 G, V3: a, H# I$ C s/ _6 O
(60000, 28, 28)& p3 f# i' R( j
uint8- v4 q. p$ o+ f' k
16 C- w1 a7 {! ]4 x, A# K
2
6 @- y* }; D1 G3& J" v6 j, u& M' m- `$ m5 V
所以 train_images 是个8位无符号整数的3阶张量。
9 f: M+ {& E4 v' ^, E
, L$ Z" T& e& { M4 q. {1 f打印个里面的图片看看:
" X9 R" Z' e6 y3 Q- t5 n# h7 i
+ l* a# @2 |; j4 @; ]- sdigit = train_images[0]
8 N5 x( h( h# Q4 z$ U d' j+ d0 n8 Y/ U
import matplotlib.pyplot as plt
& S* Q5 K; O9 g' j5 `" G& N& m l: Q) o7 T/ g+ I
print("image:")
/ |# }2 j- v5 b, L# mplt.imshow(digit, cmap=plt.cm.binary)* ]' u: z) t8 c- D: ?' s
plt.show()
) t) |8 V4 D! Wprint("label: ", train_labels[0])
$ y) O' q1 {4 g+ D3 u Z4 e0 V" A" a$ r/ {1
5 `. q, Y+ Y) I5 ?9 B3 r2
; B2 Q* ?' F& x3 a* }& m$ M5 |( d# m0 I
4
! ?1 K* h" u& }8 E* {( p5
9 B% }6 p+ ^ {" y" H, G6& |+ Q" J5 E; }1 N+ S! z: X
7
( d( k+ @0 P4 C5 [- {/ T8
/ n b+ O. B. G9 q3 _# I" N+ G输出:
$ Q* U7 v1 H% Q9 U. [! X. M, X& ^% W2 M6 `6 p' U }* n% g# ~
: n4 m$ q5 o. E
; c( K( e; y+ d5 f3 dlabel: 5; D/ e3 b- c p0 r1 o
14 ~! b; J: C1 U* s0 m: Q
Numpy张量操作6 a, K, W4 O$ ?# N
/ t Q! u E/ a8 a0 S
张量切片:
! S" f: k y: | f- r: G- G, c
! f* ]2 l+ ^) P) S, j0 ymy_slice = train_images[10:100]( P) t) X/ l8 ^
print(my_slice.shape): X9 u! b: |4 T
1* G7 Y! W9 i* w. Z( R
2
: s5 x$ t$ B) H2 c输出:7 Z p& `5 j3 v( y
9 s" I( z' K2 O(90, 28, 28)$ w+ L) O8 N+ J( P/ W
1, L- S; y( @5 r' U8 @! p
等价于:3 d! n1 V7 \% X4 j3 M: `0 |. ~- r
% }8 r L) M% P7 R8 o& smy_slice = train_images[10:100, :, :]# c% O' y; ?9 D
print(my_slice.shape)& Y5 D. Y( ]5 a( G" v/ v
1
4 l* k$ w" j8 l27 s% z l7 E+ b1 M2 |( S
输出:4 `9 M# D: t& m4 w+ `
- B( M7 D% m7 M) r(90, 28, 28)) [- N2 a# W6 W7 [# E
1; [# T4 I m+ _/ N# }* Z
也等价于6 D0 p4 A6 q+ K3 O6 z) C# q
) N3 |$ `8 H' l7 m& f# \" W- ^
my_slice = train_images[10:100, 0:28, 0:28], z. M" s2 N P5 q; q& b
print(my_slice.shape)5 t; f" l9 l! A6 @* F, L* I
1
8 t% o) H5 p4 x) C" r! I9 v, @2
% G/ ]- N. C# \输出:
. Q% T# {9 H& f: \) O; M( j& [! `7 M) x! a" p
(90, 28, 28)
+ o* A) w8 A$ o( [7 Q; r15 c4 J1 ~% L. s1 I* g% g3 r
选出 右下角 14x14 的:
: X' @! B( }; R% d; d3 z- J& z; ]4 M' f: w; V$ }
my_slice = train_images[:, 14:, 14:]# ?& E3 R$ ^/ U, F2 e1 `
plt.imshow(my_slice[0], cmap=plt.cm.binary)
% P! d! Z# f0 Q4 o. Eplt.show(): j9 O p; b* r- {) u5 Z2 T2 E8 \
1& B; Y8 g# X& A) f
2
6 Y6 k! O% p7 `! \' t6 i O7 e9 s37 ^1 ]5 C @6 Q% S
输出:
0 Q) H; O _3 g: t
" |2 h3 C: |- X; |& v8 |7 G0 n" V, S( S+ P+ m7 m, m6 b, S% L
1 f6 \6 @/ Q$ B2 ]) @选出 中心处 14x14 的:/ W& ?2 u# {! z
8 b; X3 z& F6 V/ d: Y" i
my_slice = train_images[:, 7:-7, 7:-7]4 |8 v' o# R5 @- _
plt.imshow(my_slice[0], cmap=plt.cm.binary)
5 G" [ S1 ?4 r. gplt.show()/ z6 m/ X9 ?' v0 B. _ O
1
1 z9 _3 M* ^, w! K" A, Q2
w/ c; I* ]3 f) v% d, f5 n3) ~4 Z) W9 C* x8 G) Z
输出:5 t# c d1 U$ r' W7 }! ]
& s5 i+ M- w% y }" v" D7 |, S/ F- N) |! c
& Q, t" D" j. j1 p8 w& u
数据批量
3 W. S) s7 K( i& X
) g' _1 @- K" C7 [$ n深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。& l/ m" g4 [# q9 n
8 ~1 }% h5 x! g& q! m深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
& b. i8 P# ~" V- s1 Q
) }$ l& `% P4 Q3 O0 B" J: R在 MNIST 中,我们的一个批量是 128 个数据:, I( y% s# s1 l; s. v. q
& Y9 g9 D" @8 w G
# 第一批
6 f4 R8 t) s: s- ^. q" v) Rbatch = train_images[:128]/ Q) ^8 t7 S% a; q% U
# 第二批
$ `- o) v1 r; N5 R" Ebatch = train_images[128:256]3 X) T1 q& w1 {4 L! O
# 第n批
" y/ E! p5 Y) X+ x7 `. vn = 12 n# _, M+ Q( H Y
batch = train_images[128 * n : 128 * (n+1)]
$ `0 k" l4 `( D9 e10 _- c$ \) i" @. B
2: ?& c5 R, E( P% m# a
30 L7 p2 i( [( r, [' D7 ~- d
4' G0 p; |- ]" n! Q. c# |* f) t
52 ?! e6 p" u7 h" C1 G' ^
64 u- b( Q8 P% ]- }
7
4 ] G+ U5 {* q; Q% ]# ^$ T所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
: [+ v# q6 k, T" c
$ @# R$ O8 j9 O1 c& j7 T: p常见数据张量表示
& l6 a3 }& ?" T2 [ m/ \9 C' `1 @+ T' K
数据% A. J1 r6 ^6 f
|
zan
|