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