- 在线时间
- 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年大象老师国赛优 |
+ }: q: x% w) T, \; |Python深度学习之初窥神经网络
: b% l3 f7 V) C I. I. D* f本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
5 K; x3 B% r' ^; s( ?# _2 x2 c9 T/ v F$ b
) }, E7 N2 h8 I p本文目录:
6 o+ r7 u( G! D: u8 j/ U! N4 T* t/ P2 L
文章目录
" U/ H- }) b5 m9 j# d
6 G. I6 l6 u2 m/ D% ZDeep Learning with Python! A0 W O9 ]! R' [* u* n, y ~
初窥神经网络
6 p9 X; K0 h. Q5 A* V- Q导入MNIST数据集3 A5 W2 x( U. g/ _3 {# B
网络构建
8 e/ E7 p1 ~. x+ i2 F编译
- B: F* D. R+ |5 O预处理- [9 z- l9 E- i3 |# i; m% v& y% H
图形处理" O) W$ Z( t" |# ~
标签处理* H$ A7 C3 R5 b8 ?+ j
训练网络
! F9 `6 F) P3 i0 y4 U2 F神经网络的数据表示5 X( I- S! h T- I4 z; ~/ [; O9 Q
认识张量
1 ^' k- n6 K) V/ B标量 (0D Tensors)3 |7 n/ f; m" s1 ?( ?5 I
向量 (1D Tensors)) C: L* D) b# Y% F( F
矩阵 (2D Tensors)
5 t3 D- C/ Z) V A! C0 Y高阶张量& n. w$ O# x: h+ t. o
张量的三要素
8 _$ Z" p4 H$ TNumpy张量操作
" I8 Y. O( z# ?( S& d张量切片:
7 ?6 G% I, Q4 U: k9 a, Z数据批量
( e) q0 _2 M; L常见数据张量表示
0 G, P7 e* h- Z6 T' P神经网络的“齿轮”: 张量运算4 m. F4 F' ~0 c4 }/ I) k% Z
逐元素操作(Element-wise)
& ?, f* D8 L; {8 {9 w: a8 I) m广播(Broadcasting)
+ g6 K4 t5 Z$ O张量点积(dot)
% [5 `8 ^' R- E0 Q- h张量变形(reshaping) f0 F. u7 t4 s! ^, k
神经网络的“引擎”: 基于梯度的优化
^0 q# w$ e( g6 v导数(derivative)
( m' L- ~9 R7 k( \& \4 ^! H梯度(gradient)" [0 p" D4 a$ U# B
随机梯度下降(Stochastic gradient descent)
% M- u" T4 c$ y3 L& j* Y4 k反向传播算法:链式求导0 k- q) e4 H( l* @$ T1 O2 \
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。: Z1 T! `& C7 d
2 m. f5 b" ^6 V9 V% {* ^初窥神经网络8 L* r6 e/ U( L2 a3 v# M: p6 e
+ Y! O' b* \- E8 t5 {$ B: X
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
$ q0 ? g: ^9 r6 @" e1 w6 X+ w! i7 |5 ^' o
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. p9 b2 B; l3 P' @- D' Z* s
: d% z+ G" Y k导入MNIST数据集! J6 i" O0 W4 i/ g8 j! W1 b& A
, X/ [: c) @2 z$ }; y. p" B. h
# Loading the MNIST dataset in Keras
5 i" B% R B! L' \* _ nfrom tensorflow.keras.datasets import mnist; c3 k' V( H2 G2 v+ T' e' K
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()+ J y7 R2 D7 [$ o% |& _% ^1 s+ l
12 x+ i* x/ k+ S
25 u( A8 ]$ O: T& B- \* K
3
8 j! w( y* I. R1 K/ y' n看一下训练集:
+ j9 K* I! j0 j0 H; {" g, t' n u: X1 y/ k: H' `
print(train_images.shape)4 y D+ @* E4 u" b0 k& `
print(train_labels.shape)
/ y' }4 B9 |% V1 Rtrain_labels
8 J3 h5 \$ K9 g8 G% Q1
' e7 a; I$ T t" g. o5 S2 Y: t2+ n f4 ?- _7 ?8 U# m! g9 [
3" v1 Z( h- ^0 v7 Q7 `
输出:
( H+ y( m8 ~2 h7 o* d. y( o2 d$ e+ J4 Z( a
(60000, 28, 28)
7 m0 Y+ G3 R" G2 p" J2 Z(60000,)- N" e0 F# H+ s* a# ^% J
# p$ x; m0 F$ Z/ e2 w( u. c' \9 b; J
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)" {( m8 G0 c0 J. |" F/ C# J
1
- }7 ?7 V) V S+ J6 h" j2 |$ z2
* p& ?% h- D& |' v" S, l& V9 o1 L33 L- a4 Y% q" m$ \) @1 x5 X+ P; J; T
4
/ K( W/ Y, u$ d8 g% e i ]这是测试集:# C' M: z2 p$ `* B$ N, q
# D q# A4 k2 ? H4 Hprint(test_images.shape)4 \5 r' O- A5 Q6 [; a; A
print(test_labels.shape)
! `, ~2 p1 U" B4 _3 o! j$ M: U/ h/ Dtest_labels
3 I. y7 }4 q: r0 i9 H2 d8 S17 v, `( t# N0 e
27 |8 u5 a2 y' ?$ V. _
3' F3 c! w }3 d+ D/ p6 H! H
输出:
! G0 \% w5 w! [/ L- o, o0 J% C
(10000, 28, 28)+ @/ }: H8 u' \$ O
(10000,)
2 `: s& d, s; J$ t) H7 H% p: Y! N; ?% _0 F
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
& j4 ]* j0 i# `. h! s1# k6 X, I& C) q0 S
2& v! L8 D7 z# b) B
3
* {! E! D* X' ~1 x2 I# Z: k* n4
4 S* a) y5 h: A! [" n- Y网络构建: u7 K8 e& T5 r! W. n1 u/ H
$ i. G8 F' j9 L- ~我们来构建一个用来学习 MNIST 集的神经网络:8 ~- `+ \" x8 B# ~* r
0 x. G' w! C T/ ]8 S) A: ~$ l" rfrom tensorflow.keras import models
) g% ~1 |5 z/ I7 Bfrom tensorflow.keras import layers7 C( M, g8 C0 H$ Q9 h
7 H Y1 X ^4 w2 e. d9 E% U" v7 pnetwork = models.Sequential()* n1 ~ y: p2 Z# u8 z
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
`' u% A& C- N2 G4 N* z+ F' a+ a4 gnetwork.add(layers.Dense(10, activation='softmax'))
0 z0 x9 [3 y; r; ]% s% z! e U# N18 l( @) E2 a7 z
2% k. }5 w9 v9 t2 [5 D$ |
35 M/ V" H, s, c7 b/ U9 Y
4
3 \0 l7 J( u8 T5
& c3 Z$ @. L( F: Q3 n4 b6
$ X1 o3 y. @4 E. L7 j3 f; _神经网络是一个个「层」组成的。
8 S( ]. o9 H" R' e9 q一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
( V9 @' }8 D; U, u; p
6 [$ ]1 h/ V& l2 z5 [这样一系列的「层」组合起来,像流水线一样对数据进行处理。
) N, E- c q" H0 {层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
1 V) Y8 G( n( O* N/ _
6 @ \' c: G4 L我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
+ d) `; z1 d5 ~2 V, H
( ]$ H: Q, B* E3 R4 j$ @$ u P数据到了最后一层(第二层),是一个 10路 的 softmax 层。
, i4 ^3 j% d: Y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。) A' I6 p$ e& B
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!- {5 \- C m8 H) m# ?7 `6 _5 Y I5 i
4 X- H! s2 x, C, ?6 L+ i编译
: x/ N7 @& w( u! \5 M' F, y, D! u1 a _8 K
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:& r* u0 L& q, j( f& u8 ^) Z9 B
! N* L. B7 D. L, e- \3 h+ n6 z损失函数:评价你这网络表现的好不好的函数2 `- N7 S& O0 p/ q- I
优化器:怎么更新(优化)你这个网络
( _) H/ a0 {& r0 t+ {7 N训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
. Y8 }% C: Y% ?+ y/ O/ E& `! mnetwork.compile(loss="categorical_crossentropy"," M% [/ @# ~6 V3 w
optimizer='rmsprop',1 q; a) Y7 Q7 Y8 h3 M
metrics=['accuracy'])6 v: L& r4 {, ^7 Y
15 w1 E* h3 B4 Z m
2
" s- ]$ J r* _/ l% ^3+ W/ H& S4 H$ Q! ?% o9 z
预处理
# C% L, U. L. E, Z; a" @! |* `
" c1 {& a( R: o3 b图形处理6 h$ v" Q- M% v0 W. A9 ? l
r% w& F- F7 {/ H' `我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
" Z! V- P6 i9 h4 C! o6 S
3 y, g3 ?! b- {& BMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
7 o' d) u8 ?' \# t1 q而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
; |8 \- g+ E+ {, u9 {, J$ w$ H; C4 d! k
train_images = train_images.reshape((60000, 28 * 28))# B1 f9 \. F; b" u* u5 u) K* ?
train_images = train_images.astype('float32') / 255
" w; w& s) u* q- X
* P0 o) j: @% m. V0 |9 {4 wtest_images = test_images.reshape((10000, 28 * 28))# u" c+ t% r9 B% X
test_images = test_images.astype('float32') / 255; B- n: c, A( T* D/ m$ `
1
- U' n! w0 X, r$ u1 P) F0 D2
: l6 m& m$ d4 k4 Q. o5 G9 |3* I9 ~- _- I5 B
4
% T. W f! b4 \5
7 t( W' q. X9 b7 b& J9 Y7 s& Y标签处理
& F9 ]* Y. g/ `* _, v+ F; G. v' L9 h9 H, s( h, m
同样,标签也是需要处理一下的。+ B. P1 F$ E% u5 o( w, S. }3 h
' z5 O+ Z; O0 e& e" c- b
from tensorflow.keras.utils import to_categorical
, n8 f) u. ~, `
8 @$ `) D4 J+ ]1 a. S% f8 B8 W2 Rtrain_labels = to_categorical(train_labels); J* O0 n0 K! Y `
test_labels = to_categorical(test_labels)% J6 m/ w7 k, F# G/ R0 ]% U" c: f
18 n0 D9 r! y, b9 }, @( a
23 T0 w* Y/ r! O* \
3
; j2 A2 h( j2 U4
* `* _" n, a. z- \训练网络
- t/ ~( r" m1 ^# j& E. @. m0 _
/ {+ Q; x/ s) b0 |network.fit(train_images, train_labels, epochs=5, batch_size=128)
& o) y: X7 t, ]1 P1 Q" _) j, W: l1' R% [8 A t5 }! }: u" f0 ]9 G( a
输出:
+ j6 [6 Q3 R+ m0 p5 d R
3 K: y' Y3 Z0 d3 V% QTrain on 60000 samples* v2 y9 D/ [' V2 G
Epoch 1/59 C0 W! A& n0 f: \
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
$ I- j# s2 a% R: O. q5 R4 vEpoch 2/5% ?3 _' y% D% G0 T- M
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
7 E0 S7 W4 q8 e! \% E! mEpoch 3/57 |0 u3 g8 k0 Z$ C
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
/ \2 E4 h6 R3 }$ d5 `+ rEpoch 4/57 a2 O# Z2 I$ `% R5 H
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
/ L/ v B5 s4 L- ~Epoch 5/57 v# t7 G, {* }$ e- w$ r+ ^/ z
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98889 f1 f( W i$ L* Z
4 @ @7 W! e7 K4 f, [<tensorflow.python.keras.callbacks.History at 0x13a7892d0>" y I a9 T$ b% x4 A' k% H
1' k- d+ H4 y2 w. p7 e) ]0 B; R, F
2
* g3 H/ E9 m+ e$ b/ ]7 K( ?! m3 w3" W4 k, D# O8 m+ v: A
4; B; ^9 u0 n0 V) ?
5/ S/ l4 R0 |( D% e( l
6
& G4 d9 T! h: y% u+ @4 [0 V7
! b/ ^: v( ~; R% u( }# Y8* j! ]+ @- h% }4 t( V, h1 o
9
- x- a0 S. {' t10. ~0 } ]% l8 z2 i% @. V% P0 ]( p+ r
11# E3 L0 y) W; q! Q8 k% y/ b1 r
12. D% R5 a8 g% S4 v2 q: j
13
4 L$ E6 @: K: `. _' x- P可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
. K! G9 m1 @8 U- C4 t+ _& x) i
" B/ R: B# `9 V1 I1 g再用测试集去试试:
9 P; L4 H- U0 g5 d6 B) c, l, U2 ]+ C- q0 j7 ^" N Z7 b& Y2 u4 m% U' `
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
" M6 u" j' z: x& }) Nprint('test_acc:', test_acc). n2 Q; s# j4 A5 p7 x2 z
1
- d( T# ~- ]. c, U0 y% p% ]2% u8 I* Y5 ~7 B
输出:6 \, H3 n6 J7 w9 b
$ B' }* D' o* X; Y
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789& A1 m8 b# x+ M; S. ~( W
test_acc: 0.9789+ A4 f: ^) @6 K1 _
1
9 a, E6 N' l( _) m$ \5 a/ Z5 d3 i2
5 p2 e1 X. H |# }) j& M3 P; z" i我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
$ ~# o. d9 d+ \# L+ j
" m& `) f* Y: J; a# b9 c0 @6 t2 q神经网络的数据表示& y2 r& Q' L, }& T# G/ J1 t1 ]6 H. O
6 p. ^' s9 d& n
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
; g4 A, a% H, E% a9 `
. s6 t0 f& a+ Z" }6 ^+ z( Z v我们常把「张量的维度」说成「轴」。6 \5 `% U' M- Q! [
0 B4 h* k& b# G5 l0 G' y
认识张量
, y! l0 x% P. C; Y0 C9 g1 T0 o$ \ ?" V2 s( j% e) D" s" Z
标量 (0D Tensors)" W; G8 Z; A7 I
& E. S" V: h4 H4 _% bScalars,标量是 0 维的张量(0个轴),包含一个数。
$ J- |6 A5 `$ ]" R1 i: V8 i R
! Q5 g& Y9 R q, t+ h标量在 numpy 中可以用 float32 或 float64 表示。# D; x5 S1 `3 x
2 |, G/ _. M6 D: _6 Z) b
import numpy as np
! s8 U/ o3 u% m
! z( a5 U- O* z4 C# l, Sx = np.array(12)
. w/ U5 R" G* V0 F' y5 dx: y) C" a h6 A8 u, N" c9 R+ Y* V1 j8 o
1
% X* x$ L* `+ W6 [* S# o% }4 M2$ z$ y8 h3 g% \/ j. Q$ w
3( U9 y2 A; A/ x' C( R5 a
4& n- | z9 M* ^0 L& t& n) O
输出:
0 N: g- q) T; S2 O' L* u+ d7 y- @& H
array(12)
# E6 W6 g* H9 T& b1' f6 |' C5 ~8 O
x.ndim # 轴数(维数)" c. O) O3 M' p4 U; \1 S
1: P H0 i' N" J) x" m
输出:7 q0 {& O. w2 h; z0 @- P
8 g- a# h6 L8 B- m
17 ?, I; }4 h! o) A7 E
1
, N T3 d/ n3 d- H1 R向量 (1D Tensors)
. S# o# M v4 ~+ I# h( Q2 M+ n7 f- S. J8 \% O/ T% S& D
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
/ v! f" ]/ U( V+ `: D! M# Y0 V' l9 u6 _* H
x = np.array([1, 2, 3, 4, 5])
; X! K6 c9 M$ I) r Z, rx
$ I; r& d1 t+ F `' _& q4 @1) t" F ]4 N1 M7 m4 Q) |$ c
23 Z1 M" N3 d1 y
输出:0 r# f( S8 ~$ ~" {
2 N( q% ^# G: H" e4 n$ t
array([1, 2, 3, 4, 5])
6 Z# C8 s+ K3 \; J* ^, c9 l( G1
; K- I$ I5 r: n$ Kx.ndim
2 e; R* Q1 g% D- u3 K& `; P% F18 ]8 E) `: n5 X* d4 q# e$ q9 j
输出:
0 I% w0 l8 [ ~, E* d7 z) E* J2 Z. x: J* H/ H4 Z+ k! m# d
1
/ e6 n# x d+ J% P; U8 A- t1) |9 Y# ?: T3 ~$ z; ~/ w
我们把这样有5个元素的向量叫做“5维向量”。! i- e4 }2 E" S9 u4 b5 F
但注意5D向量可不是5D张量!, z/ n2 A, C( m) E% q: X
8 l8 H% i; G/ C. ~: h/ Y# \5D向量:只有1个轴,在这个轴上有5个维度。
9 t9 f) }* K# k) V Q$ ?) C5D张量:有5个轴,在每个轴上可以有任意维度。
, T- C) S; F0 o这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。* @+ ]! I5 ?4 P' ?
4 g8 p( r* H, w$ ~$ W# j4 {
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。3 V# r2 q$ L/ `# b$ a. q& U
* e8 W: M& |3 W/ v9 o矩阵 (2D Tensors)
) q% d# k) |$ M! p" {
& D& Q+ }8 Q* I9 M! I5 C9 M8 B7 ?Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
3 e/ h- A8 k; |. |: w% {2 d: t- E c' @) g+ R, l! [ h
x = np.array([[5, 78, 2, 34, 0],
$ M: R. P. j4 r% }# K+ b [6, 79, 3, 35, 1],
- @" K$ M5 a) G7 W [7, 80, 4, 36, 2]])& m! p) {7 \& E% K% E
x7 G( {$ e2 ~- ?4 v+ ~2 |" \
1' @/ b) ?+ D: @) C# Z& A3 l
22 `) E3 J# q2 h' Q
3! y+ K9 s1 \8 u/ D+ H( B7 g1 N
4
9 _2 z0 L3 C% y# b输出:
7 B4 _) K+ f; Z) K& R3 i; \* o z1 h e' Q! F
array([[ 5, 78, 2, 34, 0],
0 o N2 W3 U v- U [ 6, 79, 3, 35, 1],
1 u5 }8 a- w* D1 o- T6 a [ 7, 80, 4, 36, 2]])! s: i6 D' a& Q) r' y
1) N; N6 O5 x5 K8 C
2
0 V% X T1 [) x# x: Q& z: o8 U3
+ z' J% n, g. @& ?# z/ b3 Vx.ndim
( i) `5 ^3 }7 V m, q1 {1
8 v+ ]2 }' e9 c9 h G输出:
" G. q4 W( }0 k2 J; I8 t% n! h
l& F1 C. [' ?2( P; F4 c0 g4 [' h4 w7 x5 w$ r6 L
1+ P, R- P D& h; }8 \, i# k
高阶张量
1 X: L8 G( p: \+ G5 e( h' Q3 g9 U2 D& Z ?3 b( m7 r
你搞个装矩阵的 array 就得到了3阶张量。
4 f1 f& W8 l- k: ]9 q4 i) B( K* f$ g
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。7 ]: P0 W2 K. W
' a1 ~. W3 t8 I4 s1 T( gx = np.array([[[5, 78, 2, 34, 0],
Q6 W& ^( s. ^. \' U. { [6, 79, 3, 35, 1],# B& ~3 g2 Y" O; B& A4 s
[7, 80, 4, 36, 2]],) ~! M; c' ^' X" W0 B w0 p2 Q; c
[[5, 78, 2, 34, 0],
# O2 B5 C* _# Z7 W7 u6 s [6, 79, 3, 35, 1],
% P, j4 C# G. t [7, 80, 4, 36, 2]],$ X. F; g+ M! r6 o2 l1 W& ]
[[5, 78, 2, 34, 0],
4 s: F8 F; S- l9 ~+ p# C& w [6, 79, 3, 35, 1],
3 e5 Y! h6 u" X) m2 o5 w [7, 80, 4, 36, 2]]])! }2 Z# H6 S& t5 r$ \2 W! z
x.ndim
/ V) ?4 K6 _7 S- V) o1
0 T2 A4 R# P! ]/ l20 i6 T7 S* h/ ^! ?$ X$ l$ x
3
0 i& E0 \% W) P# v8 P- J( ?43 ~4 _+ u) H: I; A( l
5
2 m& u* {5 q9 C8 q" S& B+ ^6
3 c( y2 J; b% g' ?% q7' Q9 b- c" {" H9 `! Q
8
G9 |! b+ _" I0 R9) _+ [' _4 x7 ^& E+ e
10
0 t# l# s( y; k3 [( U输出:
$ L7 G* _: f- ?/ ^& d% K, J9 f7 v2 J* ~8 `8 x# {. d7 L- R+ F6 x. Y
33 f0 v- [; {% ^1 `" i% }
1
% _8 D! k# b2 Z& S深度学习里,我们一般就用0~4阶的张量。
) K8 {# Q/ j! Z& P1 [4 Q6 ~* [5 f$ e' L" l7 Z& m6 a' ^: d% G
张量的三要素
% e, U; w& h0 u$ f2 _! v( p R% U4 X' B# Z; g# v
阶数(轴的个数):3,5,…
3 A. w9 L6 B0 k5 @, ]形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
0 {% m7 G! \/ Y- K. d" [! s# T数据类型:float32,uint8,…2 c# b) }8 A+ H0 O
我们来看看 MNIST 里的张量数据:2 g- e3 @- K% _" x7 y3 |
3 J% f. `0 Q7 X% d( I1 i1 e9 T
from tensorflow.keras.datasets import mnist. i! n8 ~2 w1 U2 B8 |/ h! K
(train_images, train_labels), (test_images, test_labels) = mnist.load_data() e; l: ]9 U6 E# a# M* D) _. O+ j
. W0 L0 T+ l- X; x
print(train_images.ndim)' K' f# d! a7 Q% s* N
print(train_images.shape)
+ n; J2 f$ j( h# gprint(train_images.dtype)
4 V- C, |6 n/ g( \7 h1
7 b; T3 a% c" i3 _2
. Z) t0 j) D9 y$ r3
# t- M2 Y# ?8 R7 h47 R. j/ e$ ~ O4 X$ g0 c. Y
5. m. z' w) M4 w: q' x" U! F1 i) O
6
" v) r+ r# S9 |( L4 r( p! I: `输出:
: I; @8 j, r& A# F6 }1 U" ?
, i/ O; z J: y4 Y3) U9 r8 b( b! j& e) p7 S
(60000, 28, 28)7 ?- j& j8 ] r0 Z. Y
uint8
' v+ x9 @$ ]" U1 {% E* V5 C1) v B5 ?- V( q4 m
2" x: f) q* E2 r1 K! z9 I" m3 N
3" z3 T2 W, a" w8 w6 @$ b) u" R
所以 train_images 是个8位无符号整数的3阶张量。4 K+ v* S* w& x3 V9 H
8 ]. A# g% o; B! ] E( _9 ^5 ^
打印个里面的图片看看:. F6 W. g! p5 J7 T) T
+ ~) H3 R! d/ X! W
digit = train_images[0]4 R( A0 T$ g1 I" l/ k/ T
2 T/ p9 a( s- T: O2 Q: f$ s
import matplotlib.pyplot as plt
, `* m0 @$ X. T b) Z7 _; P, R) i$ m7 r( d4 S \3 t- t0 k' v
print("image:")
2 o) V! g! M/ {4 K$ ]plt.imshow(digit, cmap=plt.cm.binary)6 V' p& j: c0 b- w1 H& e
plt.show()
o' X& \+ s; V8 Z* jprint("label: ", train_labels[0])
2 i* O5 D0 ^8 f& K5 _4 ~4 R2 e1. Z L8 n# u: Y2 @4 a# Q9 l1 N" T
28 N. ?6 y" ]8 }: ], z
3
0 w& o$ O, S2 W5 B# W* c% P4' F" p5 s, \4 ^9 S: V
5" O9 P- j( M* O; ?7 m
65 I; [& ?1 V4 p( A. b: V
7: R4 O6 s# h- m1 }6 q# d
8
( @# L8 _( _/ u3 G7 m, Z$ ~输出:# A( |! y0 ^+ B
) h6 ^2 i) T2 V- j. L, ~* ]
9 } M+ _, U# [& C9 ]5 {, p/ M' t
2 E- Q v0 v+ x3 K: R' |8 f
label: 58 A z2 k; X5 k4 x( p- `
1
9 n& q/ W# r, {( t3 NNumpy张量操作
: B, O6 _2 ?8 W" a) X) p$ C
/ m9 _' }% j! q- H: J( m张量切片:- e l, P) L5 |: t0 C ]
& f* j- F9 O1 ]4 K8 l. `- F4 hmy_slice = train_images[10:100]
% g& }1 `. m: S% `; Iprint(my_slice.shape)
7 v( ~; G- @. G m+ ?- A1
/ A9 x0 |4 N& S2
6 N. h- g& W! f& Q输出:, ^2 H9 V7 B! a3 F3 K
4 L5 W' ? H a% j
(90, 28, 28)
6 d: J0 C6 a; c! B$ j$ m, K' b1
0 Y$ {2 ]+ Q: u% @; d2 k6 M9 z等价于:) r- ^. Y$ E1 {5 U- A$ g% m
5 D, z* R0 k( t# C5 }
my_slice = train_images[10:100, :, :]
! s' Z7 O; ^6 L( N7 xprint(my_slice.shape)) N1 J$ b3 y; a
1% p5 A. a4 L5 | _1 l
2" V) {# k B9 K3 a1 p! ]3 \3 e) ]
输出:7 l6 X$ K* l- P1 P; q% T
' ]* V- p7 S* N! P2 S8 c
(90, 28, 28): S3 P" y& X6 ~0 }1 s" `: O% z
1& T+ H6 L5 i7 l1 r- L+ v1 P
也等价于# T; a5 i* r+ d) z. [. t
% C8 {: F" o+ c2 i& q \- l: p3 m
my_slice = train_images[10:100, 0:28, 0:28]
- I6 s; F" m+ H6 t6 E3 m- g. dprint(my_slice.shape)
# G, ^+ d, y7 Z' D6 Z, ?' G1 h1
- R ~6 e* V* L9 a# ]' i+ `5 h2
& E& v5 X6 W4 {0 i7 Y) G: I输出:
) L: O0 u k6 a2 e2 n# v$ e4 t9 h9 ~$ O& Q% E5 @$ M4 O
(90, 28, 28)
?* n1 w! B) Q1
3 R( ?& I' ?& l7 F2 s0 t选出 右下角 14x14 的:
; l- j/ q# [/ C7 \5 Z4 T8 @, B8 n6 V3 r' o: _
my_slice = train_images[:, 14:, 14:]
8 n9 a) x2 u3 `) A+ M* Q( ~0 v4 ~plt.imshow(my_slice[0], cmap=plt.cm.binary)
7 m9 ]. w) F( W7 r5 Pplt.show()
9 G6 Z) n$ N8 j" G1
' b+ v; y# x; `2. [# @" _' y$ ]0 [0 x8 ?% _2 N
3; W3 I, k `6 Q) s2 Z, w) [
输出:2 X1 F: i' U% V ~5 b0 g3 b
( p: X" q+ l+ A1 ^) V
9 \! d6 m& [* b! p# _$ n b0 U+ a; Y
选出 中心处 14x14 的:
7 O# c$ K& S0 X' s: c# l* T5 Y3 x6 a# R
my_slice = train_images[:, 7:-7, 7:-7]
1 z5 m% T8 \* w$ ]plt.imshow(my_slice[0], cmap=plt.cm.binary)
6 A9 s5 G2 `1 B" r3 I9 e3 o4 ?+ aplt.show()
3 g: V7 p7 k8 ]# Z: U w1, B- k$ y; m. C* T% N5 J9 t: k
2
- U; v5 r* E; d: ^3
9 q/ m- I, a$ P6 f7 S- i+ n6 `输出:3 D- I% H$ o- I% i9 I8 q" R- J8 @
& O- _, \: C9 ^9 w6 v! ]8 U; P2 B# |6 {# F2 `. w( }, l/ l, O
! _( y& W2 i/ M0 W数据批量4 g/ u1 T% ]* `0 b- g. a* \' W# `
! ~. m, G4 x1 B" e y( w' F深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
0 q G# ^7 g: q% M/ I+ f1 L& Z: F) R
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
# r1 E' t2 R0 q2 m4 S; G2 \4 U- f( j) `* q1 f$ k6 x2 r% L
在 MNIST 中,我们的一个批量是 128 个数据:
. Y- N3 B& ]) b6 w& C" w
, p! z3 b6 E7 `9 G1 p# 第一批; I1 W m5 S) @
batch = train_images[:128]
: m' I1 K: Z% [! s/ d1 h; a: j# 第二批
# p4 H' W0 M: f, ?$ d% G nbatch = train_images[128:256]
1 z6 J0 e/ \( p# 第n批
% [' N# E) t( G% a" }: ^. f; ~n = 12. x9 X7 M/ _& p& R1 G p
batch = train_images[128 * n : 128 * (n+1)]
1 C& Z# H/ o0 ]13 E+ M- { D E- W) q6 ^# |
2
# V. ^' | X$ p$ p33 n$ Q5 b) _, e, V, T* O8 f
42 a; z: m, |; t* k/ f- N3 w
5
2 p+ g* v- M& q65 O- h) W& h) t& }, e
7) X5 {5 z# i$ ^0 _% F
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
" D, ^* f. q1 H
. h2 y6 ^- q$ A8 H( Z) k- N' [常见数据张量表示
) h( F, O% q$ _0 G" q7 B6 r% u( X) z; ~) }9 s6 Z; o3 h1 H
数据$ \4 Y6 O( |7 c! S) h- G
|
zan
|