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