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