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