- 在线时间
- 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年大象老师国赛优 |
7 O, L4 O/ H% n; V1 VPython深度学习之初窥神经网络
3 D# }6 M( v! G# u: R本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
- w* }* c- I! l" S0 p& x
, \$ }) o$ {. n7 ^* a; u本文目录:
8 k4 k7 e( ?9 ?) C) ?4 Z
7 J# m! W: H M1 j- _5 a7 o文章目录
" h5 S, R5 ?2 q/ @' K6 q
0 S) s& `6 ~3 A! i# n* x f- ZDeep Learning with Python4 K+ D# R0 d, ?: \3 ^9 ^
初窥神经网络$ X# E) ~: r6 S- S e
导入MNIST数据集: _( Y% q" E3 S1 G6 ]
网络构建6 R6 A- H+ H3 F7 Q
编译7 N% p/ j8 X* j7 M7 a. r h% X3 L
预处理3 u, b' r6 c Z8 q5 E8 m8 H( U* y
图形处理& A1 Z8 c% g6 t$ e7 I
标签处理
8 v e$ w: l1 [) {7 m8 f) ?训练网络 E7 c' T2 }2 ?7 {1 B; b
神经网络的数据表示
9 ?* m: z' U/ ]% @5 q) p8 [! D H认识张量
. P) Z3 O% i: {- E% J标量 (0D Tensors)3 P) B! A, K$ }9 d5 t' P) l: W0 t
向量 (1D Tensors)
! t# Z. y, j2 A, D) n矩阵 (2D Tensors)4 q' M9 H8 l. ?9 p* s
高阶张量
5 t3 w, _1 C3 [$ {张量的三要素' j5 U! ], X0 m5 a) k1 I
Numpy张量操作- i/ q3 J' |. r9 Q8 Z" w
张量切片:
% ^2 k! D$ j b% F/ E# j& d2 z数据批量
2 y% ?, p$ x1 f# D常见数据张量表示& w6 L; v& g1 B# D6 }* r s
神经网络的“齿轮”: 张量运算; m& N, D; Q* {& K
逐元素操作(Element-wise)
" F. z5 i( |& _& m- E* o' d广播(Broadcasting)
. q1 Y6 c' `0 T! X张量点积(dot)
4 _4 ^: o! | @. Q* b/ j张量变形(reshaping)/ w' W& e9 E: i) y6 {
神经网络的“引擎”: 基于梯度的优化
) Z, c$ ^ w, p; o4 z: Q导数(derivative)
/ ^- G' A6 t) w梯度(gradient)6 h8 R: Q5 G8 K6 c% A& b4 c
随机梯度下降(Stochastic gradient descent)
0 Q( G+ j3 T, q6 |6 J反向传播算法:链式求导5 w' l& D% K* Y4 ^$ [& G6 }$ O
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。 q3 |' Z. U4 x: g- \
9 p7 Q& I4 \0 w! y# y5 {* j初窥神经网络% v0 t, D, ~6 {, X
% ~: ^+ f. q" d) F2 Z$ ?学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
" c* D! G, l5 X! V6 i4 \* x3 i, l3 E8 M! x5 A9 _
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. @% S, q2 a! K6 o* ?
7 w2 N h# m, G- S导入MNIST数据集 ?/ W+ l Q' P
- y: C" Z1 C1 v. ]
# Loading the MNIST dataset in Keras
6 e& ]4 f% P% c7 y/ M( b, K0 j/ hfrom tensorflow.keras.datasets import mnist' p+ s8 w# D, i1 d
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()! \8 ~' L% J% b6 Y3 X4 Q
1* `+ S; G* h& R, Q a# G E
2
* M) Z, w. q. N3
6 A* X* S7 W) \( n看一下训练集:
0 v! G8 E7 d3 P6 G. n4 u3 L3 ~+ v1 J+ w) U1 F
print(train_images.shape)4 w$ G5 t% _( _+ @. L V
print(train_labels.shape)# c1 B. c, a: r G2 b8 ^1 u F/ p! T
train_labels) }" B( U0 V7 X8 I6 w3 |
1
: K& [" b2 B+ A/ Q6 ~- b2: }, ^* S: i; M0 p
3
% r0 } L% q4 H& z7 q+ c输出:% Y7 T) Q7 F) d3 Y0 X% j
8 Q6 a! Z3 K. h3 t9 y; e+ g(60000, 28, 28)) U7 q) g8 N2 Q
(60000,)
# ?! g+ l1 J3 D; |9 ~+ T5 ^# i p0 S) K* w& ~9 P/ O/ r: Q% }
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)2 Q8 Q3 Y. `" m- W1 p0 [: M* i
1
! m' V' z5 U8 ], O ~1 W3 a2
$ B3 c$ N: N' L* x3! x* g4 Q1 h) Y S
4; _1 m. e- ]( j9 ^
这是测试集:
6 M, ~( |: P1 f. D ~8 p. m4 F+ p
print(test_images.shape)* U0 O9 o+ d3 v. e2 I7 A
print(test_labels.shape)
+ f5 r( h9 Z# t# g: O1 _test_labels
8 p" V& W% l# r# L1
4 v8 K: ]+ W% s2! y' Q: Z- r& }8 ~& X4 X0 F2 ]
3
( i' p% j. s5 i+ i$ F3 g0 M输出:
+ J. F$ n1 w7 B& w6 R5 X" y
/ S6 t$ N! c3 b* Y/ j: x( [2 j(10000, 28, 28) G# q' k) h! W0 S& r( o
(10000,)
3 a8 z% {8 k$ N/ J2 Z% k) _ T
1 {" Z9 ^1 }3 Y4 Sarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
% \2 d1 q' d/ q- \3 v1
- f, n8 t) _3 e& Y- L2$ H1 I/ F! S2 y4 i9 y2 O9 u) o
3
7 r: Q v7 `' X: E( `4
" a- i+ X9 {, c( g8 n网络构建
) P. J4 r1 j V: G6 k- Z2 `' l! j; W w/ H2 S( ^
我们来构建一个用来学习 MNIST 集的神经网络:
! }& D% t. j4 f& F7 G& p r: H
& L$ d3 m5 j* T9 Hfrom tensorflow.keras import models* ] g# O1 d9 K) s" [
from tensorflow.keras import layers
$ \8 `# b! U* N2 Y7 O. K% W( P9 _3 N2 v+ H4 a' V; Z) @, a
network = models.Sequential()
- j4 P. e+ T; A; Fnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
2 \/ e; k' c" c1 K9 Dnetwork.add(layers.Dense(10, activation='softmax')), F6 J) x; X& i: o
12 M$ \7 O1 C* V: _ Z3 t. V
25 F% t' G# p/ }& b
3( g; x: `" t9 m! F, i% e* z* C1 F
4
' x# F( E5 m2 z! h5" P: y( |) {6 K/ [ F. H/ h
6& Q) ], I8 {6 E! g' i
神经网络是一个个「层」组成的。( x4 C* v' s( c
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。! e2 ]6 Y `4 S- x
" m! j4 k& d# X/ e* `
这样一系列的「层」组合起来,像流水线一样对数据进行处理。+ k( {& a9 N; v, I' o" [ S
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
I0 c" V! \3 f" i- x$ _8 s" @( U
0 r: k2 M0 G( A+ R4 E$ O我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
4 x9 E j: T# f: Y$ N' d3 B- E! y7 r& d
数据到了最后一层(第二层),是一个 10路 的 softmax 层。
$ o( Q' G( `* x* p% w* S& W这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
2 @2 O+ M* M* M事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!9 B5 a9 V& P, x7 g3 \( b1 G) Q- T
r+ u( n4 w) B- n: d
编译# L7 N5 }" V7 D/ L
9 ~% Z& R- i, u$ X, H7 z! W& w
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:/ p4 ]9 E0 ]' S+ a$ V2 Z
& A( S* K( N: X
损失函数:评价你这网络表现的好不好的函数0 G k( Y6 Q2 U0 q; s/ P# J/ _1 ?' J
优化器:怎么更新(优化)你这个网络
3 q. `+ v4 D2 |* p) k训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
Z- J9 `, s4 o8 h2 I2 E/ enetwork.compile(loss="categorical_crossentropy",% g/ W, a2 k' z. G
optimizer='rmsprop',
' @( |4 U+ s" S# E, r metrics=['accuracy'])
8 {0 v/ Y. L1 ~( ]& d1
; V! K5 b- j1 S4 }2- H! N* |, x& w8 @
3
: S) S1 m- }/ ?9 x' R预处理+ N3 ^: ?* D* _5 c$ s) S' T
" M* t4 ~% L5 A0 i
图形处理
H! Y/ V' L8 Y8 Y/ y4 i
$ F& h' r, @" r- G0 R我们还需要处理一下图形数据,把它变成我们的网络认识的样子。' m l+ z- w; c% ?
9 @8 ?! H4 d& V4 NMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。) @0 c0 \: P/ ?2 `/ K, z3 s9 `
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
9 m: a0 p7 K8 d+ T: a6 L
; Z# c; J4 [1 a+ h; rtrain_images = train_images.reshape((60000, 28 * 28))
( E3 F4 R- b. @2 d4 |train_images = train_images.astype('float32') / 255
# u- g6 j/ n" j" k
* `% b# m e% K$ P3 ftest_images = test_images.reshape((10000, 28 * 28))
& b& x2 @7 a! |# a, ^) stest_images = test_images.astype('float32') / 255
9 \" i3 t. I O10 l2 l8 I# ?2 k6 P
2
: f4 r2 } X6 R3 [1 _3: F0 t- [' y( T' t9 H& c7 N
4
4 r9 H, ?) J& A; O% s) s; I5 \5
, z' K. _( A6 C! O标签处理# Z7 I# Q( N b& V; a& Y% H
9 Z7 ]1 o2 Z+ S" ` P
同样,标签也是需要处理一下的。
; U) L# W1 q# t7 G: I1 k' _) y7 z' P% W" L; x/ E- T
from tensorflow.keras.utils import to_categorical
6 s6 @. k+ C2 b" y9 _4 J4 y R9 S. ?" v2 X
train_labels = to_categorical(train_labels)
$ ?4 a! T, Z2 {+ }/ z; |1 }" Qtest_labels = to_categorical(test_labels)" F& Y) h" Y' H- J/ k: N3 }( p
1
; N0 |; v. n7 W2
! C ^% P, y& e4 T# T5 W$ i3& Q* @& S3 B3 i3 M/ j* I9 F
4( z) J' L+ Z; V7 {
训练网络" ~$ T( u* a7 N' P' B
2 e! `. s" E8 l$ B/ U0 `) I1 gnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)6 P. P2 \! v6 O9 f% s, Q1 g
1/ ]4 B2 b9 }" R, w8 D( D- Z. R
输出:
- E' o( n* a6 i. O: e/ L. j6 i
; Z( I1 _$ o* Y+ R) V. }Train on 60000 samples
. R: l2 M g0 v0 ]: z: Q) s- i" g: SEpoch 1/5
- ~: a, c7 ^0 @; ^7 n60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254 i* _8 }0 m o
Epoch 2/5
! R. p: }3 P2 \6 u* r# l60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693/ {3 P* B2 i3 u
Epoch 3/5
' r! V8 ^) s$ V60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
" V2 j2 ?. m: W; dEpoch 4/5
* @% j0 q8 ]+ e( B7 b- ]60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
$ F g2 i r0 j. Z8 h: xEpoch 5/5
# c* h7 h6 B# _1 Q: Z( k60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98888 _+ m% k. s5 f8 c: s
2 }2 G4 B2 i$ f5 e' W/ ]
<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
s( \. m, m4 }7 ^% u; `1' [2 {9 j. l( y0 H# Z b9 X
2
- r U6 ?- U7 _2 @- |2 ^37 A+ t' u( ^: h2 F7 g& q: x' {
4
# g5 W Y# B7 }. J0 ]( ~5$ `- ]4 G) e+ \$ q
6: j/ h5 R. H m8 L
7
1 j! U& d3 K, s8 p, ?! I9 ]8
( T! H$ @6 k; v$ n3 y: w* b' u- V! y; F9& ?& U' S+ M& q/ \$ s1 k
10; W1 X8 Y5 T* ?. i0 P
11. W; [* }6 Y- O# k& T
12+ V+ i- [* A& l4 [4 r2 R
13
& S2 D. \! [, q. M可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
' |% x/ c7 f8 z2 o6 A! b* t9 p0 J; @4 {$ t2 q# y
再用测试集去试试:' b# h r0 M- }* x, g. j
m6 C/ [/ B2 L8 y% R( ]4 n: vtest_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/322864 P) z6 k: _% C1 Z- E
print('test_acc:', test_acc)
! D |8 Y/ t6 x' a3 W9 g+ x14 r h; B& X4 l$ ?% ]" }8 g- w' ]
2
& A. D8 B* C/ Z2 I" z输出:
" d. r: N0 B: f/ `& b7 H
3 R; Z7 X! C3 W) @10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
2 y% _4 j+ q& w& C+ Ctest_acc: 0.97897 X+ W' x5 X1 ]/ w; z) }3 E7 E
1' e0 J0 [/ `7 |" T5 g3 P/ o1 Y" D
2
/ H3 n; B4 k" C2 b$ v/ z2 p我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。' i/ l; R4 L( h; s6 k9 F/ ~
9 z: N% o6 N- c, _: C
神经网络的数据表示
[+ Q% C$ A( Z, g) X- B) M g! w, l& k; Y1 a1 b; j/ h
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。* J. c& j% m) F2 L
$ i6 T& S9 G" T& z! q/ G
我们常把「张量的维度」说成「轴」。3 l, G: e1 v- \) {- v v1 s
. H4 ]2 _; N v, c, \% b8 B认识张量" @ Q/ e. t' E1 G' ]* q) O
|! Z# y9 g% m: i2 \8 b2 n. c& J标量 (0D Tensors)
- q( Y& M' \3 L2 i& e4 Q$ Y& [1 q& H$ N9 z
Scalars,标量是 0 维的张量(0个轴),包含一个数。
/ m' |" A+ J5 W1 m
! I; r! X9 n6 t1 [. V标量在 numpy 中可以用 float32 或 float64 表示。
$ V7 G% I, Y$ I l$ r: P4 D% `1 D! V' S n6 K% j
import numpy as np% M+ {4 L0 g X1 m1 }$ X' F8 o
" Q, d6 Y+ o7 T6 L1 B% a. j
x = np.array(12)
- U1 v& g' U1 M g" s. m9 Ax
/ g9 R4 W& U, ]; _) ^1+ b% Q6 O4 R9 G& \; d* r0 w2 T
2+ Y+ k: D. [% L3 Y" h
3
. x1 w; u- R+ v4 j4
6 n" f5 s$ ^0 @: Y. \输出:
* j* I' @" s' Q) \7 C2 e5 I) j! O# `2 S& r) ]8 P4 B8 [) Z
array(12)
0 y0 M0 w* @5 c4 E" h6 K1 @0 q1 [7 d$ N1 \+ \; l1 Y2 A; B3 Q" r4 o
x.ndim # 轴数(维数)
4 |! r6 c/ Z5 I1( B: b( i7 B% p. C. @
输出:" X. r% O# i# p. F& u o, R9 k8 o
* W, G; C2 @' P' ]! a9 _
1
7 T. _, ~4 x0 W5 B4 O! F1
# b8 Z C) I. V& C% K& y3 n向量 (1D Tensors)
- e8 u& d0 H5 E' ]; U/ \
9 s' ?( [, r& j4 ]/ P. _+ wVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
0 ?4 V$ r( p6 N9 V0 E5 Q6 ~5 Z5 P8 N
6 {! e( J% s, e% v/ e6 Ox = np.array([1, 2, 3, 4, 5])+ ^/ S+ t$ \+ h) X+ m( O9 M+ O
x
+ |* ^3 Z( ^7 n8 R1! x- w, G0 p0 J( B
2
& d8 I0 k* Y1 k& }. X输出:3 u. m3 u( q4 t% J% [/ z
: e4 r+ [ T- s- Q5 V9 u. _
array([1, 2, 3, 4, 5])8 r" j) g6 Q# j5 k0 v
1; H+ m3 i6 o5 i" O) ?. o
x.ndim, v# k( T/ q+ ]
1% q% v( a2 T$ A, H. g/ R- k
输出:
. b3 S8 i2 h; y8 ?- L R7 O& ?* ^7 Q" @* B, Z2 Q
1
) z' A. k R; @1
- L) s- X2 b9 g& n) N我们把这样有5个元素的向量叫做“5维向量”。6 {$ r, u% ^- X: {8 `' E; A) a
但注意5D向量可不是5D张量!! _! R9 C, W# d; n9 P
4 @) s+ E7 j. T1 L; z& q
5D向量:只有1个轴,在这个轴上有5个维度。, o" i, o9 \" ]7 Q* t5 X' |
5D张量:有5个轴,在每个轴上可以有任意维度。( C! R& C3 W; X. G& {
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。$ p) v' B1 J- l. ~5 H
* {1 \, C P- E1 H" j( e! e所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
H& b: c+ b7 [+ L$ H: W
: _6 t6 t' @% [* M矩阵 (2D Tensors)
7 I& k0 T! O3 R! P- i% z
7 W3 z* e% P. r. u ?Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
, y- Z) k( a3 L' d/ ^2 n" z8 A
% y2 k' N0 R4 ?1 ~, w F# Wx = np.array([[5, 78, 2, 34, 0],
+ u4 }! Y* M7 A- n9 X s/ y2 c [6, 79, 3, 35, 1],
3 d8 l# H( D) k' i' [/ a; B [7, 80, 4, 36, 2]])
" I/ L+ k1 ~. a& j+ e2 W2 z- px
, e/ h, u9 |9 z' L% l1 z4 d8 Z1
2 d& B0 u- q( Z( a% ?/ W2
5 y7 x' U3 }- V3% A! B2 ^- Z8 n5 L: V
44 V+ d7 u5 z" E) p- f
输出:
: ?9 [# g( L0 z/ M7 D
' B6 X, ]% y. {4 V# { s& S+ Q4 Darray([[ 5, 78, 2, 34, 0],
8 A3 w. r: r/ z+ n' G [ 6, 79, 3, 35, 1],
" H _( e5 S6 y }. X [ 7, 80, 4, 36, 2]])
: V: Y/ ~/ e( m L( }+ x8 x1' F, ]2 r% I9 C# W O- a* @" z
2
3 b. P ]5 Q# a1 w3
" l4 r, }9 o, a+ w5 ]! c. d" N2 b" Wx.ndim
) Z, T7 Y S8 J. v* c# i- H7 J1
7 E7 e4 B1 s& b/ ]& W输出:# a% I) P6 N8 j3 B" ]5 b
$ b) H( {7 M& U7 N( D/ O
2
! B5 r# o' O5 R/ i+ }( V0 J1
6 X4 F8 L+ D; V/ x T1 }. v) m+ V高阶张量
0 P5 j& G: k9 j1 f" }6 ], H9 R& p& s
你搞个装矩阵的 array 就得到了3阶张量。
2 L2 K) K) Z5 Z. y$ O* N8 X; y+ M2 Y
w. }' B. d) @再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
, ]6 A, c; u( t0 ` U+ j* k3 Z4 X4 @# b" P* G
x = np.array([[[5, 78, 2, 34, 0],* k. j! r1 U5 q1 C( x; p
[6, 79, 3, 35, 1],& D8 E: b, E$ K0 R h7 f
[7, 80, 4, 36, 2]],
; b/ {( ?4 @" ~0 h+ d( x9 w2 p [[5, 78, 2, 34, 0],% g) @8 l, z+ V; s. W/ R
[6, 79, 3, 35, 1],; r, ?9 F; b, O
[7, 80, 4, 36, 2]],
\& {% p" Y% `$ d2 [ [[5, 78, 2, 34, 0],
. y* g$ X; I) ]0 r1 a9 z [6, 79, 3, 35, 1],$ W7 o$ U# v: i! L
[7, 80, 4, 36, 2]]])
0 R' Z. O: T& `3 ~, e# i8 _x.ndim/ b8 x& G% C4 z) O6 ]. G7 y
13 w3 A. s5 z A2 _( `5 I9 d
2
f. ]; I: X' `: P3
4 G# A0 G1 q7 w4
! q8 R$ Q6 o0 j* P; L! T( c" [5
1 c8 g( t9 M# v* d8 A6" C+ L. H9 X0 B$ w5 q- [
7
8 ], d& V( K4 Z4 h" E/ ?8% U# |# }2 \5 c( u7 m
9, \ ^& h- E& s! O! v/ ^
10
- E( m. _; s4 [# t7 v% x0 f输出:
! S0 N1 f) C4 w: h. [: `1 Z! E
; H! ]( b! Y9 H+ ?7 y- G2 O1 M3
, S' T$ ^, Q4 m6 L1
% P. K; i' H/ d0 e深度学习里,我们一般就用0~4阶的张量。
$ w, X" N7 X0 O) z, a& q* n7 C( C' U9 ^( @
张量的三要素% i1 H* G5 k* M( v9 C
( b. Y0 m+ Y8 K! a, ]
阶数(轴的个数):3,5,…
1 O, \/ c! s5 h' K; Z形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…+ C$ t, Q" \; a* ? @4 Z7 b6 X1 A* F1 x
数据类型:float32,uint8,…
3 I" \: x# i9 |3 `3 v. q我们来看看 MNIST 里的张量数据:
$ [% m$ u" }& {5 O* V) S8 g9 p; }1 y
: `; m, @- L3 x9 afrom tensorflow.keras.datasets import mnist @0 C# K9 ?3 T
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()' g) T9 @, Q" } N0 V( Q
9 `- g$ P, c5 K- e6 {8 v, F1 c
print(train_images.ndim)1 y# _ ~, w/ ]7 D/ g6 I- Y
print(train_images.shape)
3 h+ q$ K: |: A# _% f E; \print(train_images.dtype)' W) G5 b+ q; p8 |; H
11 t+ z3 ~% ^6 H! k( k0 v
2
7 h! t, J( j) ^, B5 U: u3/ y" O1 V4 {, x" `, {7 R
4
. _4 C5 y h. y4 `# x. |9 @5 M: n3 a4 a4 h8 w5 }- K: e
6* W6 O* N, S) e: U% `
输出:
: N r- Y9 I% C1 Y( q; u* e; j
9 l( j/ E6 N# \* T" m6 y; p6 Y3
: h+ w) _5 X, s) ~( B W(60000, 28, 28)" |. t% `# g( ~
uint8. U; q# R' T8 V4 E+ b1 h
1+ n7 j3 x; i3 a, k
2
, F) W/ w, a3 M' H; i7 a0 Z. i, c3
. o; {2 G0 {- v所以 train_images 是个8位无符号整数的3阶张量。
: e2 c3 \" g7 n0 P) |- y
# V9 v: C. q1 {打印个里面的图片看看:
* D- [9 a# H3 M- a1 _9 i) R h8 s4 {7 n
digit = train_images[0]: k$ X: G5 {4 S' ^+ K
, ?9 m# \# v+ ]' L1 t Nimport matplotlib.pyplot as plt
: ]- {3 K$ G: O8 N& I2 D4 C3 f( {' ]
print("image:")
- O- ^' k7 J5 aplt.imshow(digit, cmap=plt.cm.binary)! y7 e0 B9 ~- q4 J8 l
plt.show()
q) o# ~* _8 kprint("label: ", train_labels[0])" I6 |, [) y& R1 r8 r5 M
1
9 `! X# C# ]) ^+ O2 I) d25 g$ x+ H: L7 n' U# s
37 w6 C4 N3 S" d( x& ?& |& h
47 [9 H+ h" [2 `/ I: e- ^! g2 Z
5
! I9 I- Z% d3 K' D- H; j6
4 C- o$ ^+ v( H7 Q+ O7
: N2 E8 h* W4 e. V% l; e: R81 d. S4 o! r4 y/ l" V; @ s) M
输出:6 S7 N9 b7 t* M' l
/ A; L2 e, ]1 k" S+ H. S( q
1 \* A0 d0 ^+ p+ N
! |3 |1 v' P' B7 p% O. ?) S# p: x3 X
label: 5
/ Y& y& w3 ] v/ P, {1
/ I+ q( {5 F' u7 A2 kNumpy张量操作) y3 m: P, R1 U; A: |; X
+ M' S' O: ~: W5 Y张量切片:
+ F4 d2 w3 R0 r: I, S: z
' J l! r& X) p, Amy_slice = train_images[10:100]/ D8 F- f4 }9 @6 a ? q) P
print(my_slice.shape)
; ]' l: b7 y/ h( ~2 }1
. o4 }+ u8 U% n25 ]: c* M- O# \$ y; e! K
输出:
3 \: L. ?. {0 u: z* p6 P Q
/ S0 ]+ z* U: Y+ {7 Q2 I(90, 28, 28)# E W+ R+ u. N! t, ~7 \ r9 y% t
1
4 g: T& i, \& F( U9 h" d等价于:
I3 W% T' v: f
, k& t5 k4 ^. B. n% ]my_slice = train_images[10:100, :, :]
( I+ W9 z1 ?9 {- h( Gprint(my_slice.shape)% S1 O w( b+ X" p7 s- h- L7 e# A; \
1+ ^! E2 \: M" [& c% I3 z+ B* O; [
2; ~5 X0 d3 h! m$ ?. W! \, m
输出:
7 L0 I k" \; Q P
: Y( q5 T3 z3 }; d Z(90, 28, 28)
7 K3 B4 A% V2 i1
& ]" L3 F5 A8 t! o7 G也等价于
1 m$ \' c! H& V$ l O3 L. }
; B) ]1 F0 U! x& I5 j7 h. imy_slice = train_images[10:100, 0:28, 0:28]- J; D! L- ]* [& z. B
print(my_slice.shape)+ B# e# S3 B" [" B4 \- c5 S
1
! t" b, W- `. k& {; n4 x2/ C% T2 S- ^" E; m3 q4 M
输出:
- r1 \- s$ l; M/ Q9 ^/ M
" h# z* S7 Z3 \$ G(90, 28, 28)% c- Q) O& Q* d8 X( X Z
1
* j2 i" J+ ^# M* F) B3 S选出 右下角 14x14 的:
( r$ n9 m3 m2 E2 E/ `
. V- [ F) s' S7 P! S$ Pmy_slice = train_images[:, 14:, 14:]
. d) N2 `4 J* [6 Lplt.imshow(my_slice[0], cmap=plt.cm.binary)
$ E/ V9 y$ T. f# G5 Tplt.show(). z& ?- ~: K. r4 H2 \$ U
1
$ U$ ~( u B$ c: j# d3 B2
3 T; I. l/ {1 b9 R% Y( P31 ^2 }6 ^7 j6 U4 u5 L
输出:+ p& a6 c! u* m9 j6 f% Z, {
3 v" ]8 h& _& w- z. R2 W
; f# x& H: k" u/ \2 {
& Z5 Z6 c4 Y$ t# w! ^& `" F8 ^ j1 u# J选出 中心处 14x14 的:
. y4 M/ O5 {7 S$ b# W
2 [6 }! y# j6 u' |1 H( xmy_slice = train_images[:, 7:-7, 7:-7]
0 M: J5 E% L* @plt.imshow(my_slice[0], cmap=plt.cm.binary)
* U9 d m- {/ e: Q' @- }0 l9 yplt.show()
' N2 b1 d3 h3 P; N5 S# A+ w1! H4 Y2 A& A3 p
24 U% Q/ p, L# T+ E% W, r
3
. M+ `0 I% B" S c+ @输出:6 d3 |% W: `* A
# m9 |; o' p: @3 q7 E0 L3 X( t- [2 v8 q M- `# ` I' r6 T& O4 c
+ O1 N- v* ~$ j( }+ _数据批量
6 l; o' B/ i6 {" A2 O' H: c
/ D) z3 A5 p. F7 N0 o+ P深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。 c3 {! j8 {% C, G0 i% l
1 V. c: }/ S, F. D e深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。/ c9 @2 @6 q* ~+ d/ ~1 i4 o
' v& }0 x5 x* [在 MNIST 中,我们的一个批量是 128 个数据:
9 J; V7 D- H6 S8 E9 ]4 Z, ?$ F' ?( U: h* i, x% V) g
# 第一批3 |$ F; ?. L& ~& f
batch = train_images[:128]
! X- ?# ~6 v& q8 f: Z1 ~- ]# 第二批, Q" c" A, y8 ~* k
batch = train_images[128:256]
( N; {7 K4 G5 A3 v: j! k# 第n批
2 k3 I$ D2 t6 X" n! X2 V% Xn = 12
, [. [& u: z8 Zbatch = train_images[128 * n : 128 * (n+1)]; ?, i6 k- c9 K6 S1 d- r+ J2 X
13 \1 {( a w3 j* ~
2
. o" r4 _) f; f8 i7 C' {8 _( D3
# o Y; d: u% @) R* x m) h; | R4, j9 ^0 [% P2 H: F4 J- u# v
5) \) y; G. i7 W! b0 i3 d
6
" y+ s k0 E- q2 J6 N' Q8 l7" b: ~6 r- }: H& i$ Q
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。. A- }- \0 p, o, S! [. `: ]1 y# Y
% d) G8 T" R9 s# n- ]) C" X常见数据张量表示: k% o, S) i. {# Z1 x
# H7 q8 }3 z. ?, j7 _数据
' c3 l: ~! j! t# h3 r$ ~ |
zan
|