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