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