- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565359 点
- 威望
- 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年大象老师国赛优 |
( w+ k5 Z3 `; F4 ?
Python深度学习之初窥神经网络- P: Q5 Z: I: P" K. Q
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
/ y5 k2 C* r0 d6 s; M7 @. G1 O+ R# `
本文目录:
$ t/ I" i; H6 h& {, a# s$ n# k2 Z) E2 V
文章目录
) X" ~! a% p: ]% S9 }, k8 u
w1 y% S! H7 \4 MDeep Learning with Python
$ N( k( K& ~0 e! p8 Y% R9 S初窥神经网络
, x+ ]9 K: m& O T, G导入MNIST数据集
. u$ H7 L- M; L, C网络构建) R* H8 i6 u$ X2 @
编译
9 @: f0 C, s* U- T9 Y) k- L: [预处理
) O( j6 O' X( c* }# z图形处理
. Q1 E. `) k: R7 z* ]标签处理 l4 x5 R% _# F$ \1 o
训练网络6 Q' S4 `( s! f/ W4 g' g) l
神经网络的数据表示& K) K8 d. N6 b ?+ p O0 s0 ~" C
认识张量
. p* M# Y- T7 U5 R2 {5 I标量 (0D Tensors)
1 {* B" Q$ e8 r2 R向量 (1D Tensors)
* e7 \0 j$ F" k8 w3 w8 l/ s矩阵 (2D Tensors)
$ u+ Q' `% v+ Z高阶张量0 l& G% L: p6 Z5 B9 J6 z
张量的三要素; q0 L5 {8 ?1 |& S, r. C
Numpy张量操作
# F/ C4 E2 E/ M9 k: u# t张量切片:, w) ?' R( {- ]- p
数据批量
9 X1 z% L) U8 W9 |常见数据张量表示
. g6 [+ H `5 W* ?神经网络的“齿轮”: 张量运算' T& x! A' M, \& P' L9 o3 o7 m
逐元素操作(Element-wise)0 {) v6 ^" ?1 Y) u7 w6 Z. x. U: T. d: o( o
广播(Broadcasting)& L/ w4 d X2 T
张量点积(dot)0 W Q' t6 x8 F* X0 e! r5 J/ A
张量变形(reshaping). y# E8 s- l7 J
神经网络的“引擎”: 基于梯度的优化, H0 F: t* r: h- r
导数(derivative)1 u4 _* E! r1 M( m# k
梯度(gradient), S: |# k/ c2 ]6 D) L' P% L
随机梯度下降(Stochastic gradient descent)
: a* ^4 q- w. B" T反向传播算法:链式求导" O; p" [, `' K6 _5 N' l
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。5 v1 a l* B3 Y; D( S( c2 P
4 \6 q* [# m2 W$ a- K* T初窥神经网络& R/ O! N/ b5 U
) c0 c( ~! L1 z" j- p6 S9 E) P学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
4 {7 `" q+ q/ @, h$ @4 l2 O, b7 p3 h
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
8 _6 \9 ^' T8 R3 W
8 P* M7 b! u; A* I/ f5 S导入MNIST数据集
2 I+ F, v% V, {7 {% d3 h& n g$ w9 b6 Q; G) N3 R5 z
# Loading the MNIST dataset in Keras
* l _1 f( W4 |$ ?' B4 [2 f0 afrom tensorflow.keras.datasets import mnist
[. P2 l/ c0 [! ]! f(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
( F! n9 h9 D% Q+ B; h1 ?; z+ ^; k- [1
# d: \1 }4 ~8 D# T0 [ g- S' D2
: ]7 ]; M! r4 d35 M# `" z1 f9 @. C' z
看一下训练集:1 n! e" k r) K" N3 i
' P! G1 M/ I, p" b7 nprint(train_images.shape), y4 M6 \6 S! |
print(train_labels.shape)# J& d1 [& _* J) z- [. o4 s$ _
train_labels3 k! ^' b+ _7 k6 Y* A' I
1) Y' f e8 Y4 h9 d5 U( O* J' s
2
1 A! d! z& ]4 n4 L" M7 I3
+ ]8 Z, x4 [* V* }8 @, `/ w& L% D输出:( V* S+ @$ }- J
/ ~$ b$ {+ G# I(60000, 28, 28)
8 \- c) F+ O2 f2 ](60000,)/ H% x$ c, N# v# E
1 J6 m2 L4 M& f% ]/ w! b# w6 z
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
) N8 D) z9 C6 H+ q1
# A) t& A# `0 ^9 v [; D$ k2( f5 U: l( H* V; o
3
/ q6 X) Z/ q2 o* F4# J- ?, B3 a0 t3 e4 F
这是测试集:
* Y! h0 _+ a0 @" v3 Q) k& H. C3 ~
print(test_images.shape)/ J* [8 J7 x2 m* e
print(test_labels.shape)7 z2 Y. _# v! k
test_labels
* |3 c) L1 S$ p& a11 s. m% \$ @- a% G
26 b# Q$ `; B# ?( x9 {% ^. v4 U7 b
3
, s8 o; I; {9 M: T5 p, }输出:- R R% e, l7 O9 P$ @/ K
7 \( I) b, j/ b0 k: [& v6 D. p+ V# v
(10000, 28, 28)
/ E3 h/ {, F/ y. R8 U- I8 w(10000,)
" V' B* ^( `+ u3 S( I3 Z0 q' w0 j4 ?6 E- f! P; U6 c. k& F9 B7 e
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)' _( U7 P6 B9 a
1) ~, {1 ` X3 F( |
2 l+ R4 U, O4 x4 f1 p# H
3
, \: a) Q, ?2 f& A: \* i4
# c) n/ S9 L3 N网络构建
+ [2 N5 k$ _6 b0 \% y2 x4 K* v- b7 L8 E. g1 @; e
我们来构建一个用来学习 MNIST 集的神经网络:
6 _' z, S$ {3 c' `/ n5 H) S' ]; E0 k4 V) q8 r& J
from tensorflow.keras import models2 D' B/ p- w1 w# m8 M8 s) }! b
from tensorflow.keras import layers
3 @9 w+ x% x9 C
$ p9 f, r; F0 A% M% ^! ?network = models.Sequential()) B4 S5 P5 @4 v1 }8 h' V, W
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))1 i( l& k5 A2 w. P$ F1 J
network.add(layers.Dense(10, activation='softmax'))
6 W3 z2 e$ Z( Y6 l1( f5 ]: O2 \3 m! e8 j6 _. C
2
! F4 k0 u( t4 g3
5 I8 c8 r' T9 \7 L0 o. y4
4 f& B g* \! q! q; K5; D S) D3 O2 F6 Y, i) Q
6
" q) u! ]; f& A O5 ]神经网络是一个个「层」组成的。
- E9 P- N$ P7 Z3 Y% q; D一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。+ i# F% k, F' H- y+ }
( x, n1 x' F5 g; H; w
这样一系列的「层」组合起来,像流水线一样对数据进行处理。
( S7 M- x0 d1 w/ w6 k3 a层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
4 L* E# e- Z* ^7 q) z. X6 k; u' X" ]& Q$ E
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。 p! L0 y4 v7 K
4 C0 B" [& f) d+ q4 }! ^' B数据到了最后一层(第二层),是一个 10路 的 softmax 层。; q, `" L" d! L6 D, G$ d
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。2 _8 a+ \% ]- }2 L0 t" B3 C
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率! X, _1 r) x, n8 O( i1 }, Z
) I, X( B, }" j5 ~* B$ o
编译( |2 x+ U+ H. ?5 \7 \) {
. a- o. c5 G X& T接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
; O- y5 @+ V( C5 s1 @4 t6 p( }
z8 ~+ A: d6 ?0 t4 \! l; `损失函数:评价你这网络表现的好不好的函数
7 _" k. b2 f# W# U* E0 [* h) v优化器:怎么更新(优化)你这个网络
( |5 n$ r2 x4 V5 ~: a5 Z训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
# ?6 V5 @1 ]5 K& z3 bnetwork.compile(loss="categorical_crossentropy",) S! J" H9 Y2 a1 N
optimizer='rmsprop',
& w+ N3 {! q; i, l+ C metrics=['accuracy'])( L- Z! s! g- R2 I. \
1
( r( }1 L, m/ Q, E2
1 [3 y3 V( E/ ^- m" J# Z, C3; ^8 s2 ~7 K, k5 ~7 ^
预处理
3 Y7 i0 T& A) l7 L: \4 l' a" x5 P
* \( d, m4 D! L0 r: V+ l# Q" b图形处理# P/ u7 ]9 _% j
0 v1 x7 |9 r! T" k! M5 n我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
6 _6 O; O3 \) `7 k* [ J
, f0 d, m o) @# o9 f3 ^MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。' J' ]1 D1 X+ d9 V: e- ?6 E, M! L$ z
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
8 Y: A( r) B5 Q, S; r) g( g* ]$ g" m M* C+ ^6 ~8 o0 `# K
train_images = train_images.reshape((60000, 28 * 28))6 j/ s5 G. G4 U
train_images = train_images.astype('float32') / 255
. n* [& J% h; o+ j: k( A
U' c- n/ M/ Z& j' vtest_images = test_images.reshape((10000, 28 * 28))5 ]1 V% P7 l6 P0 q/ Q0 M* v# `
test_images = test_images.astype('float32') / 255
4 R2 A! Q% \/ ^2 [4 ]# L1 G# ]7 o1
3 T' n0 w. h |2( Z5 ~& ~- Z0 ^- l4 J
3
8 x; F- v X; r: j$ _4/ N( p2 J* v; N! {& F# u1 Q* e
57 v+ _- x9 {$ j* b
标签处理
: Z+ V4 A- X5 T( v0 m% r3 _9 b9 \5 W j5 m8 z: Q9 X+ T
同样,标签也是需要处理一下的。
M* Y( B! a! \' T0 Z; U- |4 M) D5 N3 ^% l" W: A
from tensorflow.keras.utils import to_categorical
* K9 v0 z' t0 B1 a- x- |( `6 G
; V1 _; `# z7 y# V* y8 u. o( gtrain_labels = to_categorical(train_labels)6 k8 b! n) U* S- P, O
test_labels = to_categorical(test_labels)
" i( ?5 L- w5 U# u14 D. p/ R, F$ D% C3 i
2
3 A) p4 E0 y; s* e# W+ x& J30 Q2 G3 v+ F$ X; t5 D' j6 U( p0 Q
4
7 n- y4 Q' E- R8 M/ w" ~) Y& G" D* q训练网络
2 [$ H* e" U$ B0 y5 L, s# m# ^; \( I" B- Q' v! }. Z0 }6 C
network.fit(train_images, train_labels, epochs=5, batch_size=128)) o% r$ H1 S5 x4 `4 v- K
1
* l- T# S+ ~$ T7 N输出:6 L! k5 z2 I9 x
8 `: C+ L0 p( M" \) j' J" M1 B
Train on 60000 samples3 O* [; f+ r) i: x
Epoch 1/5
9 @% `) |" z3 ^) G- W60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254# E, }/ n1 _6 ?
Epoch 2/5
! j6 j% X1 ^; H9 b* [; ^9 G N60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
3 l6 u6 ]' Z- G+ w$ X1 JEpoch 3/5+ Y" g. h! d' h( g
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
# j- B( \( R& T+ h# A- UEpoch 4/5$ F1 p. {0 [; h4 R$ p' V
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
* R/ K6 u) u2 i5 Q V, Q: _7 eEpoch 5/5
* m. j$ L3 x9 W& s60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98882 i4 s o4 E* z% _
7 ]9 S1 ^/ T# h' G0 V! { p<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
& m) c" W- m. P1
1 i; o5 o! X3 A8 A! H7 x$ m2- c1 Y- @2 G/ X% }
3/ g3 d8 i% n: v4 L& J$ b
4
' o- c$ {. Y+ q$ d1 l5) |8 u: { {+ p* {. C
6& r1 i( J4 I* y! e9 l
7; w; `' l% i4 c+ f4 q* k
8
2 B# c2 s# p% |3 y0 t9
- c1 a, c" a. i& R0 {" y3 o/ x10& M9 C5 P3 j) O/ G# \/ A$ G
11% _3 N/ K% N$ A! k
12
* k) J+ k; e* a: S0 e13
! K* M: E" q8 j9 f5 p9 y) d可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。- l" E& v/ L1 b: K7 m
L9 m5 T% r( X, y0 h再用测试集去试试:: A: x. Z, ]5 M0 n8 K
/ h) }; Y1 r- s7 }- {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
& q! V$ S1 Q' b4 R2 \7 y8 E+ S# Gprint('test_acc:', test_acc)
, i0 m. h4 L- c! |18 G2 X/ [( F0 U
2
) [" h) m0 @# b0 k% g6 u输出:9 g7 v7 t4 H' [; U7 D! b
, p& ^: H( K, ~, P1 ~, z10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
$ x6 B3 g9 t: M$ _. }5 ^, dtest_acc: 0.9789/ B; t. G! M" X2 c5 V
1
) }1 L2 D- P. Z" O7 |( @ |2) T6 [" u( }' C! E+ \
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
0 ?6 u2 b; Y6 X- {5 I, V' L4 {; U [3 O' f# f9 a5 `
神经网络的数据表示' z1 o1 Z, c9 @" O) |3 w6 h( ^
1 @& |, ?) v5 f3 wTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。- K8 _5 e; F. G4 I; w" A1 y7 j( d5 s# }
& ]8 A% J6 _5 `2 J' D: F我们常把「张量的维度」说成「轴」。( c, K8 i5 w3 q
d( b0 F' h* @# g9 a& l2 l
认识张量' ]: `4 ]" s2 q( U5 k
0 d+ O6 p5 Q/ q' S5 s
标量 (0D Tensors)* P9 g& g0 h5 S$ V, o) p4 V
8 l! b1 W/ v+ t# C2 ^# }# xScalars,标量是 0 维的张量(0个轴),包含一个数。. l8 T# ^* a$ {4 W5 K" U
: {2 F( a. K; U标量在 numpy 中可以用 float32 或 float64 表示。+ k$ j+ N3 a9 U) x
9 P6 n& o0 B& m( V, F+ [* w9 Himport numpy as np) \( T( W& E9 b, j8 S% }1 \
3 ^0 f$ K$ {' J W0 S2 x
x = np.array(12)
& X/ O; R9 f+ \- Wx- u4 X; f# {9 Q! R0 \0 N* K% S
1
2 I3 k- g. X7 q1 b5 D2
; k z& A0 a8 N0 j( w33 Z3 j1 B$ m/ q
4
+ W1 i, ~8 \- k输出:( u' P- C4 K" J2 n; J+ V
: S% U0 o9 l% U
array(12)
3 m; a# ^& a( y3 L& G( _17 X* s" z! ]5 A+ D0 ^6 X- W3 q
x.ndim # 轴数(维数)2 v. Q% J! Q3 H# ]
1! J4 v5 l* A! s3 [' q# ~: d1 I
输出:
6 A! _$ O* x: a3 r
" P% K, A d) W4 f$ i1: a: f2 U* |/ H9 k) C. ?
1
) H) C3 z: d. f( x- D D6 T+ {向量 (1D Tensors)
6 K8 Z2 W: ?$ h) }3 k! j2 T6 `$ N5 R; S5 L# \
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
" z: W" B# l+ s. U' d* z n1 K4 ~+ ~0 Q
x = np.array([1, 2, 3, 4, 5])$ \) j. G5 V% h# D( E
x4 v3 c( [& F3 W
1
( z7 f0 [& r0 T$ Q27 u% j/ S8 L n% A5 x& ~8 I
输出:
1 Y& B1 E! e& g- C9 b6 i$ s5 e+ @ }8 p
\/ A: i2 s) g; G7 A" l# D! m5 K: Tarray([1, 2, 3, 4, 5])( P8 \5 O" a6 d
1
/ O s$ m! V" ^: nx.ndim# @% p: ^. N+ L6 p) r% Q
1: v- E( C. G% _- u
输出:
# Z% Q% ]1 r# K( p- m1 K/ K
& `% X2 `" w4 o: J1
3 ^" `+ `6 v* `$ R$ R1
* N B# T) |- {$ U( H5 \& g* J我们把这样有5个元素的向量叫做“5维向量”。. d9 n' X% {2 f% p% Q9 ~
但注意5D向量可不是5D张量!# w( U7 I6 B4 i+ W( z
4 F% V7 P( `1 z# n6 |! U5D向量:只有1个轴,在这个轴上有5个维度。1 J, S; A% [8 m
5D张量:有5个轴,在每个轴上可以有任意维度。3 m4 s7 K5 w, M: A; I
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。6 x( g7 I, |7 k3 C/ s: V
9 _6 w# } V" @" ~8 W& a0 v
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。9 {& Y; V5 X% A# u j
$ R% _2 c9 G/ I; q. O
矩阵 (2D Tensors)
3 x( s3 R5 A$ ?. M; R
" ^, E( B9 s2 U& a4 t7 YMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
, {0 `# R. |3 T X" R# |$ A2 b1 q3 z1 S M' Y
x = np.array([[5, 78, 2, 34, 0],
9 C4 A# O$ q: U- R; q [6, 79, 3, 35, 1], D+ t ^" S7 c! `0 d
[7, 80, 4, 36, 2]])
. O; z6 A, _" n- p; Y8 wx2 G/ P5 l$ D$ p
1
/ Z1 D5 l( p5 U: m; `6 G& o2
4 N, S; X- q4 b3" S" I" I/ f9 a% @, {& M3 @5 z% A
4
/ }) W$ ]6 ^1 |! F5 U1 P输出:3 K, h/ Y# F6 j$ L; ` ?" T
: F/ H. h7 O ~5 @) N& yarray([[ 5, 78, 2, 34, 0],: t5 s' |# R& S% I) P
[ 6, 79, 3, 35, 1],, V# h) C) _* r2 g0 ~
[ 7, 80, 4, 36, 2]])2 ~9 _7 b3 D6 I& R/ O, o" E: d
10 I0 G5 t' }5 ~- h; N
2
: O7 y. s8 G9 d* C# h3 n3 o! [# ^" h2 `8 H4 I5 }9 |
x.ndim6 q7 L! Q; [( I# o* y
16 T* Z# e# Q. {; ~
输出:
; g7 ?; p# k. r/ L- }/ \# {, {9 ~, l$ X4 A
2- V5 h; d) g E+ ]- f+ q
1% D4 w1 O/ H6 a! J H: u
高阶张量* m) a( n# Q" W- Q( N
# M# o0 r' }7 H) |3 U/ k9 ~3 m/ U你搞个装矩阵的 array 就得到了3阶张量。/ ^( U6 q) _$ [% d
3 c4 v) m6 f" M8 R# Q% ~& `* P$ E8 [再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
3 r9 B$ P* {( z+ j9 N' _* g2 M$ s
x = np.array([[[5, 78, 2, 34, 0],
* w$ x6 Z. P+ m( c( X X0 Z [6, 79, 3, 35, 1],# ^% S; d% n' d' x; V
[7, 80, 4, 36, 2]],
1 Y3 v& g7 F5 d8 P [[5, 78, 2, 34, 0], _ ~1 ?* r8 I* a+ z) X9 o& h3 [
[6, 79, 3, 35, 1],9 d3 g' D7 S7 N
[7, 80, 4, 36, 2]],% C# _, c' w- ]1 H- }
[[5, 78, 2, 34, 0],
5 ^, W3 |5 B8 J' {2 Z9 s [6, 79, 3, 35, 1],
+ U/ `% x. k1 r4 E8 B6 U7 x- }% ? [7, 80, 4, 36, 2]]])' |% C# K7 \5 z2 {# ^+ @3 J+ O
x.ndim$ r& v3 @. S$ j" `( P$ N$ P
1
( |4 S* O- \# P2
1 F0 @- v# e, R0 r/ g3
& q" u4 s& k! {( [8 l! d4# Z' U. B# y$ y8 L2 \+ x3 t4 G
5
# O, z6 n3 s9 L! u6
t9 ?7 c& A! l% E6 x: A70 n$ k* N+ ]* u
8
. K. P+ L6 {2 X- x* h! g9
) @+ C. b- _' Y. C. r5 @$ p10 B3 d6 N1 Z) ^3 n+ F
输出:
6 `# c1 M. G' m- u! H6 p- {( }" n5 Z8 S; m! S) O
3' |" J2 y. W$ s! p! ^
1
. f0 J6 u/ @' E& e$ P! m8 a w深度学习里,我们一般就用0~4阶的张量。
2 u+ J6 G( I# s7 t( B
" `" T0 l# R" a1 m3 ^- @$ u5 L0 p$ P: L张量的三要素
' y6 Y8 p& {, d+ D4 p. q
7 p7 J* u# }* \( R& k- J阶数(轴的个数):3,5,…
; U8 J8 q1 R$ C6 g8 Q ^形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),… u5 y3 B( i6 @( F- d4 H& u
数据类型:float32,uint8,…5 |, p8 T- `1 a2 ]4 J U: s* `
我们来看看 MNIST 里的张量数据:+ T. s) l% V. d5 ~: Y# v* ~& s. B
& z+ a7 O& e V6 Pfrom tensorflow.keras.datasets import mnist
8 J* w- P2 T" ~8 W- {# u( l(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
- H$ h' M! \% O( V6 V! C3 H; k# | |& M" {+ Q: j
print(train_images.ndim)
6 f a# q/ h1 Iprint(train_images.shape)
) l& ]6 ~! p1 Lprint(train_images.dtype)" o: f( z1 a( _
1
# \0 X) T$ ~8 B' T0 B7 C* d4 u2
+ j- y% X8 j4 |$ K% y! @! H3
/ ^; p# |* p- p* L! M$ }3 D48 I, {( E5 [8 W: V1 F: d% V8 u
5
9 @+ Z3 }5 O+ }3 Q. A5 }6: V, ? ?& Z/ a0 I
输出:6 e, t# P5 g! G) f; ~7 a4 V
, N6 S# A6 X8 }( }
3
; I( ]$ z J/ E: K; o" V(60000, 28, 28)
- r* D! L$ c1 p* M) }uint8
" e4 S4 I& F8 N! s4 b1
$ o# _) I0 U: t& ?2
x2 z+ a w3 m8 E3+ L: }1 j& T& J8 G- ~+ E; @
所以 train_images 是个8位无符号整数的3阶张量。8 A5 L; X, X2 H6 w
2 Q- [2 S" U4 B打印个里面的图片看看:
& Q6 n0 T0 E1 ^8 u' A9 x9 B+ j* c% l: @9 l+ `
digit = train_images[0]5 j L/ X: p" Z+ Y
1 M* K! u( e! x: m5 [
import matplotlib.pyplot as plt
8 O0 {4 g5 @/ d/ R4 z/ _) K9 ]( q7 p8 d3 h
print("image:")" ]+ E* p( G; ^3 `( O$ n
plt.imshow(digit, cmap=plt.cm.binary)3 |' C& d6 z* q5 S) o
plt.show(); m: V! [- e; z( Q8 C. r# ]
print("label: ", train_labels[0])1 p$ ^6 Q& q# i& V, X
1
D9 g0 ~% k% T2
2 m* o, [# Y5 a: e! o3( f2 P. |. y0 G! f9 u! _; d
4# J7 d2 M/ b1 V# c5 T& C) x
5
* J9 M6 _4 Q( m$ o6
9 I+ L$ X' O( ]7 w; c, X70 c) P# b# Q$ j+ g3 D* f. D
8
( e$ C/ R: E5 }+ S3 x* i/ G i) C: p G输出:: q# K8 ~" F( I8 Y$ y: e
2 U u& j( b C+ } X% w3 o
+ ~# r& m" p$ x
. O' ^4 U# X+ f# ?& \3 |7 Olabel: 5
1 \$ {$ j% L8 Y& _9 P1+ t" V5 e8 ]+ u( Q
Numpy张量操作
& I) ^1 _, F6 r3 [& ]
1 m- M' Y+ F$ D6 J! \$ h张量切片:+ g. ]* C% L3 f' W4 y
, X' ^, x) A: I: L% @
my_slice = train_images[10:100]
+ ~2 m; n* I( b$ W8 oprint(my_slice.shape)( Q4 [1 {/ f6 w% z2 q* p G0 t
1
# Y: z! D4 p) T8 r* C' f2 e2- m' K9 ~) M4 A% F+ d6 i' I* d
输出:/ |) e! J9 q- J% M( k0 [5 \
* d9 i1 y# m' h- L8 j) F; B(90, 28, 28)
9 R' s0 X; ]0 O$ [5 L# _1* C+ E1 U4 B7 x2 I
等价于:2 n/ }8 J; M3 l+ q7 d/ }$ _
" V/ g2 C$ R7 X0 u/ }my_slice = train_images[10:100, :, :]
1 G0 q7 O4 K, o- }- I+ G* Gprint(my_slice.shape)( T, S t( U" N" W, p- i
1
! {8 P3 W1 u" z8 ~, M! E2% y" C! I$ ]3 t( j! ^* [
输出:( H- W( e3 ? [" d1 |& [
: `. m& J. [: [
(90, 28, 28)* @; U2 Z4 X. x' |
1
( ?& H6 ]6 t+ w也等价于
9 M1 f. W1 f. Z( m, K
# c% ^9 n. l* Rmy_slice = train_images[10:100, 0:28, 0:28]3 e; A9 ~5 X. w; F$ |; A
print(my_slice.shape)
2 ^( f% g' `# g7 m" i, S1
- F7 V/ K: }5 S2
- Y/ v; l. J0 r+ d( t8 Z$ B1 z4 F输出:
) Z8 h7 K' i) a0 E6 U) D0 O. E9 i& Z9 _ ?6 E# u F
(90, 28, 28)
. R# \7 P4 z' o) ~+ h9 I9 Z( X1! L; N+ u1 y; g
选出 右下角 14x14 的:4 s$ {- w2 m: u/ x- n' P4 z1 _ X. g# g
: Z8 p5 \. T" O. {& qmy_slice = train_images[:, 14:, 14:]7 \5 `# c% M6 g7 L4 A
plt.imshow(my_slice[0], cmap=plt.cm.binary)* q, T" s# e" a7 N
plt.show(); P7 K) j; X" O @% Q
16 U" v9 A) E- ], m7 V y
2. P! \) B! T* m5 M) W! x& X
3
9 k! W4 K2 W/ U0 `# l/ ]0 Y) q6 y输出:; `1 ?$ c) b9 f" }+ Y" ]
: l8 r- Z) ^# E9 t
2 W1 y, u* S, w
1 x& k) c; g2 r3 B
选出 中心处 14x14 的:' T, x6 ~/ n" S9 C' |- ~
/ S3 X& o. T3 q8 c2 K
my_slice = train_images[:, 7:-7, 7:-7], @- m2 o, L$ g1 d+ P& n+ u
plt.imshow(my_slice[0], cmap=plt.cm.binary): ^, M: w; i z- g
plt.show()( X3 Q& Z, {$ E3 Z
1
, V! a) E' |% F' @ h5 c0 @2$ Q& z. J" p: W9 H1 x) k9 D
3- h7 \# _7 U" G( b* J" B
输出:
/ G, N0 w8 b7 J% G. W% Y2 _7 W& T: p! @' f
' i$ W: \; \ \( E0 `8 j/ Z' n3 R5 r5 Z) A2 F9 i
数据批量
3 P4 |( G) |1 i5 `6 H: @
) h% O8 E3 l" J5 ~3 \深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。" m T( b5 M& J D( z
; a9 u( a0 A1 z, [6 [; N8 Q s6 b
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
- k! \( K4 v: y! b' ^! N
) ^3 Q/ r$ U* n在 MNIST 中,我们的一个批量是 128 个数据:
- Z7 D$ {0 u- T- S( M+ N5 L
+ X" C: K3 v1 O: F) E# 第一批
+ H0 I3 Z3 s# o B! z' ?. G% Dbatch = train_images[:128]
0 e& P6 U7 P& J) Q3 z# 第二批
, m2 v3 b- [2 ]. `2 J( c% y# ?batch = train_images[128:256]/ ~8 X3 c- X: _
# 第n批
7 x. d& S1 b, ]5 E; d e4 v! In = 12
# w/ }! k4 S/ a* J' m9 Gbatch = train_images[128 * n : 128 * (n+1)]; a7 |0 q [# ^ @6 V( k
1
7 R( q8 s! }( @ A2, D# F* t1 e5 L X6 X
3
9 k- S: e2 c% e) S, m8 w9 T6 e4
; ]% h4 O% O G' | Z$ k! a" _" u5
( i+ W2 }8 u0 g x6
f, j& z( M/ M+ |7
1 p' l1 ^: T$ Y所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
* A( E/ |( w `# t* u* y& G: N; w+ N: w, z* X/ y
常见数据张量表示9 n4 H0 K+ A7 p" ?& L6 w
+ t" F& ?' f2 u4 w数据
8 U! @8 p3 d) p) H6 k |
zan
|