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