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