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