- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565406 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174845
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
8 b6 v& N8 m" Z8 _5 v4 DPython深度学习之初窥神经网络- V0 Y7 F! R& y% S; F2 w
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。# k1 { u( t8 F2 S
: u- e/ ~ ?4 Y3 \( i9 `" K7 y本文目录:
, J" i+ k, e# E3 \; C% \
: F; X; I! m5 ` M( ?5 S9 ?文章目录; h3 {, n$ C" I2 J2 c: d: Q3 ^
R: J4 A; l7 t# d. s" s
Deep Learning with Python
. P, K3 s: y7 g( G7 M1 _0 B初窥神经网络
) q) Y; @* J+ l导入MNIST数据集+ }! c' K) q& ~1 b
网络构建' j" B9 T c7 {; u: n
编译) Q# D( q2 J) N0 Z& u E5 Y
预处理
$ O0 v* k/ _, L' \$ o1 ~图形处理3 ?; z' E4 t9 }" j. n I3 M x
标签处理- ?: d6 v; o. }# T" ]$ g
训练网络
! g* X" [8 }* o& B S, Z) {神经网络的数据表示
: a" D8 `' f% w认识张量
. D/ |7 x9 ]& a% v J$ l. Z) _标量 (0D Tensors)
+ ^/ {6 x. ?3 x6 R! x: m$ J向量 (1D Tensors)! E9 p* X+ w( v' ^) ], V2 c
矩阵 (2D Tensors) X# X1 q ?" \$ C+ B, b, A7 ?
高阶张量
P; D; p- ?" A6 o: J% n张量的三要素4 {; A: O5 Q# }3 j, W" B
Numpy张量操作
1 p c; h ]7 ?! y张量切片:! J) M: d8 a1 Q: S; Y' D
数据批量
9 l% n# b8 b) P- Y常见数据张量表示1 M' |2 h9 d5 e+ b {1 i4 B- |
神经网络的“齿轮”: 张量运算8 k& F5 _' N- O2 ^& ?
逐元素操作(Element-wise)
- J6 G) b2 i2 A" v9 q( p8 @广播(Broadcasting)
- k7 i% ~4 z: n( |8 F- B张量点积(dot); m0 w2 ]9 P. f5 m3 S2 d4 } D
张量变形(reshaping)0 \4 _4 Z& q$ k6 Y
神经网络的“引擎”: 基于梯度的优化
& b \6 g. |& [导数(derivative)
: c. j, [1 N- Z7 g梯度(gradient)
6 y. r" K/ q/ H p随机梯度下降(Stochastic gradient descent)$ r* V; n" D/ O0 A: D& y
反向传播算法:链式求导7 B- I* Q: q! n+ ?- ^4 ^
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
; B% w+ l3 j: v7 L# w
( {; q) w4 N \& ?3 y初窥神经网络
4 [6 w) J; A" j/ f, E1 s8 m4 ^7 m, J0 V+ F
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
# P- `3 X( r x5 g0 t* J
& Q/ ~" J$ j; F) r8 X4 p3 z" dMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。 `- L8 n& w4 S9 [( \- Y( e2 V& i/ |4 g4 n
% K" N1 E) U+ e+ K( r& O导入MNIST数据集+ m3 h( M. o& ^" X# g, l& X
T4 o, }; C9 P. b7 m* r
# Loading the MNIST dataset in Keras: {* k( G/ n% f* `: x
from tensorflow.keras.datasets import mnist
, N p1 t3 X% x- s1 m# O, {(train_images, train_labels), (test_images, test_labels) = mnist.load_data()& Y9 F9 ^8 A/ Q- ?+ A8 J# D' J( D
1% {+ c# ~. u" o. g
2
6 q2 P0 Z1 n% I& H i3. _ a0 \, I' ]& B3 W- f+ I
看一下训练集:
5 I& b) p: P; Q) r6 o7 s+ j' O; ^+ g' g7 L% M9 S# Z$ J
print(train_images.shape), p- W" p6 _: ?7 o
print(train_labels.shape)- z0 q* ]# F5 C/ E
train_labels9 j" F: f0 Y, j3 ~8 h1 D' h3 I- n' G
1 m' _3 P$ |0 d+ G' d! y; O q
2* V& P, s7 p( r+ i
3
, e7 g, K E. n8 v0 N0 x& h) J) X输出:2 _; N% K/ O3 C3 a/ t
8 b5 z7 U, X3 G(60000, 28, 28)* {- \" U o; f- k T' D
(60000,)
" |5 s+ a1 y) u) ^
* L- w5 s9 @& m: J3 N6 Aarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
6 H1 O3 e) V/ _+ e. A1
) n3 J/ \( I0 J, X8 B$ N7 s2/ Q2 e5 _ ]0 U! k: @
3) _& z3 b+ o% I: P* A4 b; H$ `
4
: w% O& l e9 A' n2 f这是测试集:
" _ n8 B: f+ h g" g: W
2 B& Z# q6 Z7 V7 U# mprint(test_images.shape)
3 Y `* K& s' J' d* \3 Sprint(test_labels.shape)
9 z* ~# n7 ~" P+ Dtest_labels
^. X# a) f) Y& y; k) A: l+ C1
4 V8 q7 d4 \4 d24 _ j& w" T M
3
6 J# q4 }: p$ f/ T/ D输出:
) }) u# _, F7 Y6 [' k8 _% ?
) i5 w. Z/ @" b/ Z( l/ h8 Q(10000, 28, 28)
B! K# `% v* y! f; ?(10000,) m. R) w. P, q) v0 }- O
5 z: H# u7 t4 }5 Uarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
, d+ l$ r" h$ J; G1
: K# Y6 E1 D0 t" E* Y2& b0 k2 ?0 _% L4 Q8 R& {
3, \, `) e, N/ o3 ?; W k ]" |
47 `8 ~- x" O# g* c& T$ i9 o) F
网络构建
: z" u& W/ u$ N" o0 O9 z j! w6 v& H' H A
我们来构建一个用来学习 MNIST 集的神经网络:
3 ?" m. i. G" i1 ^% ~
5 j; K0 x) h/ \5 Nfrom tensorflow.keras import models
# E4 V6 n2 s; o% w2 zfrom tensorflow.keras import layers
% T' u2 y/ w" Q! r5 F0 f: J, |, @5 v0 Y9 y- Z- N; T, s+ d' p5 c
network = models.Sequential()
$ \$ l, V. E, g9 C* h) q; j5 lnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
7 M" a, d. O# h ~# o8 E) }# E8 v; knetwork.add(layers.Dense(10, activation='softmax'))) y& p @+ @7 m2 o) K* G3 l2 U
1; l! \' c, w8 e4 U0 P1 K# e1 q
2
$ a. b/ Z {" L30 j7 S d: x! a0 R' @
4. [" Q! C. W: B9 O
53 U; k* l! J4 O
62 k- F# X7 }+ E7 J3 ^5 C: I* U
神经网络是一个个「层」组成的。- S# i1 I) v0 J4 i! L, W5 K9 C, h6 f
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。1 k% j* ~/ L$ V+ X3 \: `7 q
- J g/ y3 S7 ]5 V7 K, X3 h
这样一系列的「层」组合起来,像流水线一样对数据进行处理。( Q( F3 y( \1 A% F; X: k
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
& }( V. X& e, x& l
% H0 S2 X- B' N( c& y u1 }: }/ t我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。+ v! x" |- P) K+ u; y/ }9 t( W
4 N! r) E* h/ v5 q
数据到了最后一层(第二层),是一个 10路 的 softmax 层。
1 o+ ?6 Z3 ^; Z/ n9 y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。* Y: }% u; H9 i- a% B: p8 [
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
' ?6 Z# G4 K& _8 O
9 u% b! x+ W' y, Y- L% }" e: g编译6 w/ Z0 a8 G% F" y/ K% W
8 v( p/ W+ p& e1 H5 r接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
/ S" r$ V: e* b3 w3 \1 n z( y- e$ o6 @ y% t
损失函数:评价你这网络表现的好不好的函数
- Y7 h& _: f) D% _ t7 d优化器:怎么更新(优化)你这个网络
/ z: P3 h. z6 H4 E' [2 e2 P训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度1 {+ I2 x! V/ u9 @1 c
network.compile(loss="categorical_crossentropy",5 N5 B K l m' Y g( Y5 W% ~0 L& m3 f
optimizer='rmsprop',
; l& a9 w/ X7 D* R metrics=['accuracy'])
4 u. b, l c$ Y9 b5 R% z6 {1
' Y4 ~/ c- F2 c2# T' a/ M) z, ]* K: i1 g
3, t/ n! x m3 u8 x5 {. f
预处理
; L- Y/ K; J" x& \
6 s2 O' O3 Z/ z" R" K图形处理& Z! q) c9 V: K5 V: r. \
. Q" ?- F* ^+ @ ]- X8 y* u我们还需要处理一下图形数据,把它变成我们的网络认识的样子。% ]) @6 h6 L5 {+ Z
& i0 D1 B: g6 J9 h5 \* G
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。' |$ k/ V8 ?! Q7 k' g
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
6 N# d0 {. P. y* R( w x* c/ ]/ ^- q' ^) E
train_images = train_images.reshape((60000, 28 * 28))
4 I, l4 g% i. t0 I9 X# G |$ ]train_images = train_images.astype('float32') / 2552 P9 j# d# H N
" f' c+ q4 Y, u* P& r
test_images = test_images.reshape((10000, 28 * 28))" R7 i+ I! e8 t/ w. Y" ^/ X
test_images = test_images.astype('float32') / 255
+ D/ M3 G6 ?! Z1
6 J; x: v, j" F* I5 g, q0 F28 ?! \6 `. E3 p7 Z/ i) c
3
! X& I4 [/ \2 m4
9 t; p* g# j/ M7 \( y6 k50 k! ?+ w; C5 M6 j
标签处理* F6 p$ P4 W- f5 a- N
* y7 a! r) a3 ]1 L7 c& u* z P
同样,标签也是需要处理一下的。6 u$ a; ~7 @) R. o
- |& Z U( V, ^# m( Z: Qfrom tensorflow.keras.utils import to_categorical1 r6 Y5 n+ ~+ C7 Z6 H
% k$ U1 Z( \; V* D6 {train_labels = to_categorical(train_labels)
# T6 U9 q$ ]" T, D/ B4 M' w1 Etest_labels = to_categorical(test_labels)7 {; P4 t% c0 Q" Z( A# H2 x: P! i
1
7 [6 f- u1 p4 I. D. g! I2
% j/ Q5 c) w8 V9 g+ r* }31 t. V7 C& d) [$ |
4
9 D+ J: O1 l$ _1 y' _5 C训练网络
$ O- d3 N5 I- |# f1 b' R- y1 r& T1 ]) P: v3 `6 C5 g3 O
network.fit(train_images, train_labels, epochs=5, batch_size=128)- S2 W0 x v& T0 U
1$ e7 Y. g, j( o' D& G k3 o
输出:
) N) p: t w9 P2 P# G% H8 o( ]2 C, N5 L8 z! `
Train on 60000 samples
3 P/ b6 F6 c6 V/ ]Epoch 1/5$ C7 E$ S) }# G
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
4 R( @+ ~. p a- X' |Epoch 2/5, a4 ?8 g& D3 {
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
/ M0 x2 ~) E' b& u V X& X8 b# KEpoch 3/5, D2 `/ l' o0 A- N4 v2 _/ g6 `( ]
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800. L" v' n% c# Z
Epoch 4/5% o& ~2 n1 Y* f5 @
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848# c$ a, U! N8 l E, c# R" M
Epoch 5/5
6 u& i- H& k) K3 \/ d60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
) b5 p2 \- L1 X- k; e% x Z
7 C. [+ l) O4 Z6 Q<tensorflow.python.keras.callbacks.History at 0x13a7892d0>6 ~- B/ C6 V& V8 Q" z2 S3 ?0 B
1
# d; t9 f5 B$ Y6 S0 c2
' O6 Q8 S+ d- d% z. u3$ h9 P8 N/ Q! N6 n
4. l( t% v- q/ m" E! ?7 N6 s
5
+ F: C) I2 x9 ]$ A; B; }* {65 \, V1 v& d7 N! v# I" x
7+ N; T/ f8 E4 r+ U
8( E8 }8 R0 m; G3 `: A4 A; `$ k
9
6 u' Z. c# u4 ?" H& `* ]5 [10! \4 n, t j+ C' S* t6 C/ G# W
11/ _% y* h x+ Y! F5 w! Y7 R3 w$ L
12
& S/ Q3 M9 T! r! H- q @( A0 e0 n13: O5 O H9 d Z6 E' m
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。4 l' Q0 N4 G* Y, s5 a
7 H5 R d6 i4 u再用测试集去试试:
& H; p, X6 ~( Z2 I& T$ T
% ^6 P' {( u5 Z1 v7 C* ntest_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
8 C7 r/ m! O9 X) J+ M) L' ?print('test_acc:', test_acc)
: d7 X" R! X5 Q17 R$ K/ T3 d& }8 T4 z$ l) d
2
; E& O |- P' }5 c输出:
" L3 b& A9 G4 B* W! b
8 K0 E# F/ `& k10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789" z2 ]" ^7 b3 @2 Y- i5 }- @
test_acc: 0.9789
5 h9 ^. `% h) f/ d+ f$ \7 w, f1
: p8 C( v$ n& i+ |2 e( Y" |' v9 I" a
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
; {2 {0 ~3 c6 t% r9 M- h( X9 G" ^, T" n' q$ ?" T& q, @
神经网络的数据表示
, q0 p; M* j! Z9 @' v/ L" l% s C' c9 ~: [1 e, C7 a; ~# K
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。8 V- b* E9 d; t% k
: ]7 m7 ~+ H. @2 K
我们常把「张量的维度」说成「轴」。
1 m% X, W. s0 w5 h' Z. L# d3 j8 t6 g; C4 n
认识张量! M5 X6 j% e7 N4 M7 O: E
; q' n: ]) L4 {- H
标量 (0D Tensors)/ B* V4 V$ q T3 c* P
7 h) g. z# L/ S. X9 R/ ]& J, _
Scalars,标量是 0 维的张量(0个轴),包含一个数。* |- R+ c4 i: e3 ~0 k
; F9 E z7 l! T9 t, {4 f标量在 numpy 中可以用 float32 或 float64 表示。
0 ]4 s% \% b8 H- L: d9 K
* v0 c1 w' B: Ximport numpy as np) ^1 o8 O5 \& c" [% L
6 [. B ?' \& g. Z4 qx = np.array(12)$ x Q6 r+ s& l' h J" W) {+ I
x @! y2 d( q# G
1( e1 T& Q/ i- V( E( f( L& F
2
# E/ m4 a+ i- f, K. G/ [1 [7 ^5 R' z9 d34 ~8 ]5 s) [3 m! [: @
4
. ~( y; n3 h; a! _9 \输出:0 t7 ^+ C- W8 }# y) [- a! f
v) K$ T$ ^% f; ^3 D
array(12) `! c4 t7 v0 {" `+ Q9 {2 H
13 l/ k/ `# }! O3 `' X2 ]
x.ndim # 轴数(维数)
: N S8 s- P# ~) l+ Q1: O k J5 P% D
输出:
: Y( Z5 h) d5 q$ l0 C' o
! W: q4 o- y* i, p( ?1& _6 m( y5 a( |4 a2 A4 z
14 r. O" B/ c& x/ O
向量 (1D Tensors)
' d, G8 X' U/ u3 u9 S: e
6 G& O0 m' y$ o; DVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。8 }3 a) K3 y( p: H1 A
$ ]+ j( f: a* _9 k+ c# tx = np.array([1, 2, 3, 4, 5]). e+ o, e1 \/ g
x, M$ [: F8 @: F
1
4 D o' V- }+ f" T: P2
( X- @- G- }5 m0 ?2 L# w输出:& r$ H8 q# t3 ]. o J) q) x$ E" Z9 o2 {
) X7 Y! L7 W5 g$ o' ?
array([1, 2, 3, 4, 5])
. o5 S. L. K# h& m1
8 z. @3 `( p; ~; y( ^( O( Q5 u" e% wx.ndim5 h* [ p2 W, {5 Q: P% D
1
7 P/ C$ q, o) h, K W2 J输出:
+ ~5 a Q/ v* d- Z% \. m" v2 U. d4 E" C5 D; B
1/ C8 G# v0 e/ A7 n9 }# g
19 a- |8 |: k* j: s9 V0 X- P. i
我们把这样有5个元素的向量叫做“5维向量”。5 @. [5 {2 o; ~% }) W9 c1 q3 K
但注意5D向量可不是5D张量!
$ D% H1 I' N4 u: j0 w; p; H
0 o3 I( }5 o: P8 L2 I/ @5D向量:只有1个轴,在这个轴上有5个维度。
! |3 O5 `0 B& ?9 y r5D张量:有5个轴,在每个轴上可以有任意维度。
% c3 H/ @8 R) t9 [- S5 d" k* U& e这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
- k t9 P0 v' k
V4 I5 W4 q; C7 |- K' F6 R* |( n# ~所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
+ @! l) B/ `$ v# ~5 v; x/ L$ u# j6 n1 X; l0 j' k
矩阵 (2D Tensors)
- {5 o2 o5 r; d* P7 ~! @ r4 g' ]4 U \* x* M1 ]
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
6 V$ `4 x) g" a7 {( N6 P
% A2 _& H! i1 y9 v v7 t* I$ A/ z6 }x = np.array([[5, 78, 2, 34, 0],2 s( B, x0 i7 [+ H! C3 ], t
[6, 79, 3, 35, 1],0 F% `, G8 T; M9 D( `/ R0 i
[7, 80, 4, 36, 2]])8 \# L, `% E) i8 |
x& r( d/ d; @9 e- ~
1( f, I# D% x- }
2. T* |; o c# ~. S: [3 E/ K; |
3& i2 a" j$ d0 ?+ x
4
$ x7 ^* D4 a% R. b2 [$ f输出:
4 p% ~5 Y' i6 C j! }1 \$ A! R) y
array([[ 5, 78, 2, 34, 0],
% [5 \ l" G5 m9 X [ 6, 79, 3, 35, 1],
9 y ^! [1 p$ M) \0 t4 D8 s( [ [ 7, 80, 4, 36, 2]])
" |$ k% x( Z+ |5 t/ {1
1 `% g! t, T; T+ t! C2- @# F; M8 q, H0 f8 _6 [- m" f5 A
3% K2 k* I& I- ]2 S1 W4 ]
x.ndim
" \* c$ W0 ]0 j k: W* g) M1! @/ y e9 ?+ ?% }7 m
输出:
) [- D# n1 |- _+ C! G! e Y0 E' {; ` y+ {/ F5 o- A: o* O
2) ?$ U6 I; f% _9 d/ J% O# C5 @
1. ~$ ]/ p0 {( S, S
高阶张量; F L, I+ G' l& i. Y
( y; z/ V3 R. e( o2 B5 m7 v你搞个装矩阵的 array 就得到了3阶张量。
* H: U, {/ f0 ?$ P% {
3 [& Q6 C2 W2 n# [3 f再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。0 y+ Y7 c. i% `' j8 F
3 p6 W; B6 {- e* f' S9 Xx = np.array([[[5, 78, 2, 34, 0],
: P5 C7 _/ ?& h7 v' T [6, 79, 3, 35, 1],
6 O! q$ e7 a7 E9 a ] K7 h( Y, Y [7, 80, 4, 36, 2]],
' J* h0 p1 a! r' b7 u5 G [[5, 78, 2, 34, 0],
; h0 d( l0 h: e- g6 y; K& \ [6, 79, 3, 35, 1],1 V, F+ k. r- o. u- t* L! c) ^& o" I
[7, 80, 4, 36, 2]],
7 P' n7 W9 l D( V4 E [[5, 78, 2, 34, 0],
, l. w# x! u$ } [6, 79, 3, 35, 1],# P& s7 y Q J, J0 z
[7, 80, 4, 36, 2]]])
! o* {2 y" `& c* Zx.ndim
9 w( r6 e( K& t2 s: J& p; J1
8 E1 b4 G1 y& L2
$ q) b1 j% l1 p: C; N A& O31 u6 j% d' K, `0 M6 c
4
! u; \6 ? `# x( _- o5( T9 \# F0 r* M; Q9 d
6
4 U" d7 u0 |$ m4 ^7- W; G" a/ h, f7 M% v* |
8
+ a& x M) [ j, a" j0 _2 O9+ \: p& N' |0 P2 K' h( J
10
3 v; l- f# F3 E输出:
|4 j8 G% P' f! J# v9 x3 |; V' n6 Z6 K n' p# q7 t1 C
39 H i7 G) ~3 ]
1
3 N) r/ V/ X5 I3 _- |深度学习里,我们一般就用0~4阶的张量。
: B" v2 T/ F) e( ? q s9 a5 r: Y# K5 y6 w+ e4 P/ }
张量的三要素8 y7 y3 D! S( n
/ d$ T; I* |% c& O阶数(轴的个数):3,5,…# Y- t4 [ J& D7 Q
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…& c% Q! ^' z4 B9 L
数据类型:float32,uint8,…* s1 W8 x3 Q, W/ P9 `
我们来看看 MNIST 里的张量数据:/ p8 b. \, R- n3 r, F9 T
# }8 C4 D* S2 w; A" W2 b
from tensorflow.keras.datasets import mnist/ ^0 H5 V% n( e, Z, C" f X4 N& i7 m
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()' D: v# k! e! {! N% h- ~
- S' j2 w# n+ o( Aprint(train_images.ndim)
' p; X) e* G: k& _" @# O9 B" j6 c7 ]print(train_images.shape)
& v Z6 ?& g8 m9 y6 xprint(train_images.dtype)
?* b! w* k" v2 s2 a) f7 n1
1 Y" z( A- x2 }; q0 c& ~2+ q/ Z9 p) G y( C9 e
3; ?3 c( j, O) A4 g
4
0 l7 y% U& ^7 L8 b9 a5
9 B G& p: k1 {% y$ a0 l6
: X( }9 y0 b4 p/ L W输出:) p- i4 a" M' ~) p$ S% b
/ o) x' M6 G" a7 \ T
3
; c0 J- u9 Z$ A3 N(60000, 28, 28)$ ^+ Q, a- z; r' n$ A2 S) ~
uint8
7 l2 @! U, G5 n% x' U) p7 I1 `% ^+ s- [" F3 v4 y8 n- ]' W
2
8 T, w* F, S+ P: j* G8 |3
' m' E8 f1 Q! w' [+ z2 k7 p所以 train_images 是个8位无符号整数的3阶张量。
. U7 X8 P# J) Q* S+ F
7 ~- S& o' |' A! W9 I. C3 B- x1 V打印个里面的图片看看:/ ]2 ?3 Z! z6 w! b. |0 }/ S
, S }" j( Z+ D5 Z6 D
digit = train_images[0]
) H# _/ c3 a& v) x3 J/ N% b5 q5 W1 K( n! ~$ K7 Q# ?4 @
import matplotlib.pyplot as plt9 c% t6 J# t0 n3 I: ?; p" B
4 O0 N4 C: {9 q$ I+ Bprint("image:")) }6 t5 P; A: o
plt.imshow(digit, cmap=plt.cm.binary)3 U0 m; T% w2 r
plt.show()3 t+ [0 Z+ c: B H% x9 v) `
print("label: ", train_labels[0])9 o% I6 C; P+ m* V+ {- c+ X* |
19 M5 U$ s% D* G; N
2
1 f y) Z e; i, W+ C3' r5 ]( l" K8 p; K( d
4
. w+ m g4 B+ ]5/ q8 L0 v5 G+ j) Q$ @
6# h* x5 }4 r; x# D& C) k
7
% C8 a6 n& c* A. s8( I7 @( U, I! s# Q7 S% ?
输出:6 S, F4 _5 h B* P0 d6 O" ?& G
/ {1 D0 F2 G8 ^
6 }( m$ H! n2 A6 f q
2 x% O+ k) d: c# t* h" {
label: 58 S7 o1 W1 z& k3 b3 m; k, x
1: t( Y' f3 `( M* x% r3 k
Numpy张量操作. z9 a. w) D! m0 ^) @$ @ k
3 C0 w9 H3 b& b" o* C张量切片:
6 P" O% Y+ |7 U4 f5 d4 k: A0 s3 `1 z( J0 ]+ ^
my_slice = train_images[10:100]" t9 a& a% h1 _! M2 ~
print(my_slice.shape)' G: `3 }' J x% i! n( t
1- S1 |% ]. B, f
2
3 E2 u; Y: J7 l3 K5 E# t" M输出:+ g( J$ ]4 T: z, U7 v# D7 W0 h6 l
: Q6 U4 F8 T2 E9 O* h
(90, 28, 28)( H: Z' x; x; u' c. {, a
1& p8 t3 t4 T, b9 K$ [
等价于:. d6 ^2 y, W3 j: C* Z
/ ?8 q# K! v4 ]* L: S( {- M8 L# ~) mmy_slice = train_images[10:100, :, :]
; h% a# D+ U+ h5 e# wprint(my_slice.shape)$ ?( ~/ q8 @, X' e4 W# f- \3 S
1
' m/ r' G" B3 _" d2 z0 v2$ L( c5 c; H' {, a, X6 F
输出:
: d/ _$ j0 ^" ~" \" t0 b2 d9 |
5 N' q5 o. f% d, t) L
(90, 28, 28)+ H4 J* f; d; y; v$ _% q
1
' ^8 @( f; h8 ?2 ~也等价于
+ Q# ?6 _% s" g0 C! j' b8 t0 Y. }! i s- E1 b7 c
my_slice = train_images[10:100, 0:28, 0:28]$ h, L) R% s% D9 f/ ]
print(my_slice.shape)
, r. g1 w& w# d. v1
7 M& R1 Q7 R& q! c2: e N; _5 f) O6 E* u7 `
输出:* N& _" V0 J8 c8 A: N
1 `2 H8 P# k# t. }) A' O
(90, 28, 28) o$ `0 x: Y4 v+ J8 h
1
( E' S; S) I4 [) y选出 右下角 14x14 的:3 B7 {4 j5 o2 F2 j9 b1 Q) E* N/ B
. Z: f7 @5 L Q$ g$ S0 V
my_slice = train_images[:, 14:, 14:]! k! e# E5 u6 X2 _9 j
plt.imshow(my_slice[0], cmap=plt.cm.binary)
! |6 `) Z v1 pplt.show()( w% X: X; n+ h& ? p. m! |
1
0 k( q9 f4 z0 i% S2
0 f0 d% E3 u I6 q$ x3
* T" a l2 g& b输出:
( B: {/ F# x6 \8 W5 C6 d
7 r) l5 b' l2 g ?5 O' F1 l5 O
. j! \/ y- y" D' F+ P5 o: `$ f& ?3 ^$ O G$ J1 Z; W
选出 中心处 14x14 的:
F/ U, ~; a0 K5 h% X5 j# Z& ~8 D( j) Y
my_slice = train_images[:, 7:-7, 7:-7]5 X2 D) k0 a+ b) p- Q6 v7 q b
plt.imshow(my_slice[0], cmap=plt.cm.binary)
0 l; U7 g9 A3 D3 W' o* Qplt.show()
+ y/ x: C( D( o- v. D! S; p6 a1
, n. @0 _3 j* D8 \7 @7 K9 H G% n2% a \4 q/ _; R; n
3
3 l9 J$ Q ?& K" u. p; _输出:
8 A- _3 E4 L# |/ T; k! X, e* v/ X
' X3 g. n# ^2 Q% C3 H
A1 O3 O8 ]3 z) T数据批量6 p$ h6 |, D* y$ E; u
/ Y, V0 B" i2 @
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。. R) m z! j9 A5 E& C% [8 F
; `( u' g# j# ^% L) D* l深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
; t# N$ \" i+ X% w: b5 H9 z
) q. i9 \* T! b+ |4 i) @& }在 MNIST 中,我们的一个批量是 128 个数据:+ J& `9 J# Z' v/ d
4 i3 _ W! D; e* T% S) ]# 第一批
1 X4 _3 u, q5 P& p' ^batch = train_images[:128]) t2 A! Y3 F) B9 Y( X4 G$ \* x) [
# 第二批
; ^( C* s* k2 {( |* rbatch = train_images[128:256]$ b+ g9 k+ M" @9 m' w+ r! c& M, H
# 第n批
$ a" D2 D9 M) e' B9 J( P6 Wn = 12
3 S6 G: k5 @5 gbatch = train_images[128 * n : 128 * (n+1)]
/ f* s* B" r( u( R6 y1; @8 l, m2 }- S4 o% i
2" N+ q( ~/ j8 F4 l$ l) Q
35 N2 n, ~7 @- V4 w) d! I$ a0 C8 x
4) i8 B' H% f9 F! H+ ?
5& d- Y2 V( ^% f6 h5 o3 M! \
6( l* V T+ b1 h
7
$ t% d$ [# K+ p# J所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。' U6 N! I6 {4 H9 v! n
$ @$ T4 J% \# S" [, m; F; q
常见数据张量表示
7 O. L* K( p4 L j g* v9 D4 P- k1 Q- s) z* `6 E% p# d
数据9 K) j( L! l5 m
|
zan
|