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