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