数学建模社区-数学中国

标题: Python深度学习之初窥神经网络 [打印本页]

作者: 杨利霞    时间: 2020-5-12 11:55
标题: Python深度学习之初窥神经网络
; u. q4 q1 d0 e# Z6 f
Python深度学习之初窥神经网络- L# L/ H. \2 C1 t. P% n
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。  }: N4 p- D8 u6 Z  T2 D) n6 w
; Z3 S$ G. e2 X$ O; a4 ?- A6 t
本文目录:7 u' G4 M) o% R

" v5 T2 F  S* f: M# E$ `文章目录8 B$ M: i# n. _3 s5 r' ?( T

* w( [0 p+ h" a/ @+ tDeep Learning with Python
2 M3 z6 i. u. n! u* N初窥神经网络
' Q9 o' O* E) ?: @- n5 x' r) V5 v导入MNIST数据集% }! u! M' t  j
网络构建
( f( Q0 s* H5 h编译# o2 q" G) l! Q/ Z' P5 L! X
预处理
6 E; }. E7 X" L% a6 C图形处理" d7 g  R3 C( [! \+ i* E+ s  ^9 D
标签处理
  C. \0 @0 x# w$ r训练网络+ D+ k. k1 {8 m* O; o4 ]! O% g' S
神经网络的数据表示* W3 k. u( {* C* T, |3 ]6 f
认识张量7 p6 i2 \" b+ U3 z6 F/ C3 D. ?
标量 (0D Tensors)
; w8 W3 C& c" J. F' i向量 (1D Tensors)
" o3 l, ?3 _7 o矩阵 (2D Tensors)5 B) z) V: d- j5 |! @. T
高阶张量
; K. L# i' p$ C, X# E张量的三要素, d; M6 B; v' ?/ O
Numpy张量操作
/ }0 q1 B, v2 Q* `张量切片:0 L9 s7 K4 R( A
数据批量
% {. u  U: N4 U! {; o常见数据张量表示
/ q: z* U; f1 e6 i; P# p神经网络的“齿轮”: 张量运算$ Z* m8 x3 e- y/ Q$ N9 J
逐元素操作(Element-wise); R/ v2 l! O8 C0 }! J7 c
广播(Broadcasting): G7 j) f# ~# H6 x7 J" b
张量点积(dot)
' t/ L3 D# ^8 Q7 A5 |5 N张量变形(reshaping): l; r; i8 {: W7 J7 {
神经网络的“引擎”: 基于梯度的优化( f" |# @$ J3 H  Q3 ~' M7 {
导数(derivative)3 n, D0 n1 N$ w6 Q8 I
梯度(gradient)
( ?0 S4 C$ d, y: f8 y随机梯度下降(Stochastic gradient descent); n; p9 B' L( J4 M$ f
反向传播算法:链式求导
/ e: p! s* `7 V9 L: e4 ^4 p, |本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
- L+ b0 m/ ~7 R# Y
0 S7 O3 q- v; i& T; E初窥神经网络
6 s7 m3 u! T( D0 p
7 G  G* i2 H$ F5 k6 q" `$ P学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
$ f; U2 C7 s! F- X
3 @& J3 ]! E) h3 iMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
0 H  s9 J" @: _9 O5 N: a
' Y: W" _8 s) [导入MNIST数据集
% i; o9 e- U: y0 l; t- q. K9 I  A! M" ^; G
# Loading the MNIST dataset in Keras5 w" m- x9 o$ F
from tensorflow.keras.datasets import mnist. b5 d) a/ t3 A
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()5 H& S: G2 o8 R, N; q0 l& |8 C9 a
1
! |5 C9 l/ W/ I7 Y27 U( N5 [3 w( Y
3
. u( L5 b6 @. E  q2 K/ }看一下训练集:
6 w2 ], ^) e+ i' J: Z( T& c9 X# _
print(train_images.shape)$ Q" x6 b% k) n+ Y: I* V* `( T
print(train_labels.shape)
0 Z% B) a$ E% D( x* Q4 ^& ntrain_labels; m1 x1 y# E0 |
11 j8 `$ Q( `; d* `
2
7 \9 m$ x7 C5 v' A( O* {) }+ U3
8 s" s. d( U7 u0 u  _输出:
+ e0 s& r& X& g- C4 }( Z- \  P9 W! S3 m1 ]# \. p9 y
(60000, 28, 28): s  m$ r4 N2 z5 O
(60000,)8 x: _4 q: B$ U

3 m: J. p+ x, M9 }& R& Z5 ]* \array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
1 z& T% p" r( i! O, v$ ]1  v% _( h$ [5 ?0 P9 e- k8 l9 z
21 f- b& r% |8 E
3: A3 i+ K$ K# L/ d
4
% ^+ A# s& d% s7 O0 m这是测试集:& ^9 R- J5 ?: f

+ G6 b9 U+ I* f- S! L) Zprint(test_images.shape)/ Y5 ]9 G7 `7 T2 ^7 c% r  V/ [0 H
print(test_labels.shape)! q; c* r2 t3 S6 E5 v0 L
test_labels9 }) _: X- G9 O$ @. Q
19 `1 R# ^9 @9 ?: y  b8 I$ P; g) j. K
2
9 M8 x. m3 B6 p7 k$ k3) Z3 p% P0 k7 T) _. D* \! v
输出:
( n+ ~9 Y1 c- ?; j7 N' u" |$ t
+ H, j+ O! ~# N(10000, 28, 28)
; v) q' a- @$ D" w, [2 m(10000,)
' K# w# d0 M8 W/ j! R% G$ L) s& @+ ]& B8 i) {( i
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
$ A6 D  X3 v; ~7 j0 l1 F; @% \1
! L# O+ E. e: @" l2
  m5 Y% o% }3 n/ z* B! j3
2 \( h- \; ]8 e4 v' ?4. M/ f- H! r1 T9 R, m2 W
网络构建% J5 Z7 p1 ~( _* m1 F  V
2 {6 K3 N) X+ y& ?- E  k
我们来构建一个用来学习 MNIST 集的神经网络:8 ~' N- g3 X" J4 f+ T

5 Z3 y$ K0 U7 V( kfrom tensorflow.keras import models$ D+ {: A# q% {6 d2 I' C
from tensorflow.keras import layers% F& u8 \; T7 i; F  b
2 B* ?5 n+ B" u  S0 }/ n4 Y6 x
network = models.Sequential()+ p5 f$ I# ?# E
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))  k  }3 k! S$ `7 u
network.add(layers.Dense(10, activation='softmax'))- p# E, m$ z1 f  q. ?/ h& D7 c
1! C" f9 z- x0 p* \  O. X  M
2
% V$ X3 @7 [7 H" _* `3  [# }$ |* C# ]  G# V
42 h, ^, |( x$ G% D* X0 Z
5
+ G! n9 E2 Z, E67 A, Y1 |5 R+ w& W
神经网络是一个个「层」组成的。4 X+ X7 C+ m# _. W' g
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
$ X* h( ?8 h9 ]) \5 t0 s# Z( I( Q0 v5 d+ o3 W1 Y- Z
这样一系列的「层」组合起来,像流水线一样对数据进行处理。
4 y5 O1 }2 S$ A8 \/ H# v层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
9 z, O; B5 }' K+ v& \5 C
9 Z# F2 r6 p0 x" e" F0 @我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。; _2 c1 S4 k/ O; P

7 u$ c* [3 d. E数据到了最后一层(第二层),是一个 10路 的 softmax 层。
9 Z+ M; f9 L: r这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。) r" a3 f, u  |$ E
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!) i1 a+ g9 Y" E8 @) D

7 K0 t' r$ f6 n" ~! ], q编译
, X6 Q/ F) c3 `7 I* v& l
. o- p6 w$ r6 `9 u7 M接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
2 ~- e9 w* x) b. z" ?  {
3 C( t, C% C0 T: N! T- O损失函数:评价你这网络表现的好不好的函数& h; X6 o9 f( B9 V* m" s
优化器:怎么更新(优化)你这个网络- r' ^2 ?6 Z! S+ x7 f
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
1 P. l; S* _1 R5 D$ i& J7 ^' jnetwork.compile(loss="categorical_crossentropy",
  A, ]+ }$ b0 n3 w, c; C                optimizer='rmsprop',% [7 ?) }7 F3 A6 D' o
                metrics=['accuracy'])
7 e' |- k7 P- f1
7 ^4 E3 Y. s" a4 F  e2
  l' W" H8 v9 T$ I$ w3; `/ z" c# @: Y- w+ Z" A* q  j
预处理
4 C9 z& k2 \4 c. D, g, }4 S" V9 b7 e# T8 g
图形处理- X  r# Y; T' W+ ?8 O" n
. l9 E) M: K2 ~
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
: \8 F3 x: x. @2 P5 H. Y( c5 n- ~# V& f& }
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
8 f. L+ A: r% Y0 h( |3 H% F$ }8 _1 K- T而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。3 q( E- r( T4 W$ I9 L
* E7 i  h/ ?1 T. q2 f7 R3 E
train_images = train_images.reshape((60000, 28 * 28))
- Y& P% K4 c+ ~4 Rtrain_images = train_images.astype('float32') / 255+ C! d! Y) ]/ M) ^! M

5 H1 Z8 @4 g' }" [test_images = test_images.reshape((10000, 28 * 28))
0 v0 u2 U6 M4 ?5 x$ p4 @! i8 c0 D: Ctest_images = test_images.astype('float32') / 255
% n0 K& M  _" [; S) t0 k) [1+ H' I; F9 }! s! ~) U: I/ m
2
; ^7 H8 S; ~1 b1 _6 _3
8 q( r" }3 _' ?4' b) C' _- {7 d( a( h2 O! L
51 [+ X" M9 S- V( \3 m3 T3 I( k
标签处理
. H' g2 b$ x% S' K
. I) g) \# }  L同样,标签也是需要处理一下的。
8 j! \1 Y7 s! D: S
# s  K9 B& J0 a+ }: k' S) `from tensorflow.keras.utils import to_categorical0 P8 F* m! {3 J

" F7 u7 U& }8 k$ K1 r' l2 Gtrain_labels = to_categorical(train_labels)% Y9 {: S+ n( z6 \4 E, |
test_labels = to_categorical(test_labels)
# ]- s7 o" r- K+ q7 ?% r10 N% D& T( z( o$ t" B0 z( q
2
' C! ], U& z' t- m3
( X3 \6 C- Q! p- u8 ?4
5 W8 U# O; u0 Y训练网络
7 k# m! t9 H7 y6 h% q  Q; B. g
0 ?  I4 \" }# Q1 m/ o  tnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)
! E% y6 j. Y0 H2 {1# b& P$ X' a; f' P6 s4 [
输出:) w& Q. w4 o  ]' M* d

) [6 ~2 a7 ^1 B* Z3 `7 cTrain on 60000 samples
2 m: V6 J, B& o( N" jEpoch 1/5
: [3 x; G2 [$ e5 L  Y  u60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254& x$ }5 @1 x* c( f2 `
Epoch 2/5- W) Q" J1 j' v
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
/ Q8 X1 m, d1 X' p1 R7 |Epoch 3/5: j& r% n; U" Y; G: x
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.98004 ]: ]* u. T9 O. R' P
Epoch 4/5
* L, [% A' q6 t3 {1 o: c60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
; b: |# Z0 |- m7 S. Z8 IEpoch 5/57 F3 i& q9 x1 @
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888* s0 r9 e9 ~  U3 ^+ R

" |/ F: N" r# h<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
) P, E: X7 }  n* a9 O1
5 o, m+ I8 N0 [% V; _+ S, p26 a- l% ^* X- |% Y
34 E$ X4 W5 u- }/ S! P, U
4: Q  |; `1 g+ Z
5' j4 B2 U' f  a  v
6" l# |+ p- @. I3 Y; F
7
5 \6 t! U! y1 k+ t% o. G" Y8
! J- T. O- @- A9, ?) S6 w3 L) o* s. j
10
" l4 p% R. Z" l) L: b& y) Q1 Q11
+ \+ Y* H) `# Y* F- G- a2 k; M12
  D; S$ _% z! X3 Z13
: o% `! j1 T- q$ H; L可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
+ H, B. f/ a4 V  u# q
! `& k/ c( Z% c1 M" t5 _/ ~再用测试集去试试:
* N9 v6 |: h$ z2 H& }1 v- Y5 c6 C. e; Y7 ~& k4 j" W* T
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) V5 _8 p; Y0 L3 S* y, u) y
print('test_acc:', test_acc)
) t0 `; b% c' I  o9 p& a1+ |" u. O% X, U5 w
2
3 c% G" [$ O% n9 R* q; a. G" W3 N输出:" a) m4 E) n8 I
7 \- F: S( q! p! ]2 Q
10000/1 - 0s - loss: 0.0362 - accuracy: 0.97895 |% s  z9 W) v/ T. B
test_acc: 0.9789) }% X& \' D! _9 e4 O% h3 p) Z$ ]
1
5 |) b. c, Q8 w- D+ t) R. ?; T2
% o2 ]. b; n" z我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。8 }# z: d* e7 n9 K9 u, Y; M! o3 k$ P
: O9 Q4 T9 L9 x, U& I& q6 O
神经网络的数据表示
4 x/ E( ~! h9 ^% J) p# {5 u/ @! p; t1 K' |+ ~/ L
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
& x% ?# _+ ^+ Q( h$ L+ {! `7 I3 E' G( T, U( u# o4 ~6 @
我们常把「张量的维度」说成「轴」。: Q. g. R4 N7 @) ~: B

2 N) p) h9 N! U认识张量
; K6 c0 O/ D; H( l" j
4 D* T- _$ I- o标量 (0D Tensors)4 T% m/ l) ?/ w8 Y3 q5 Q6 K5 M9 t' u

% o" w$ {( p+ s. k: WScalars,标量是 0 维的张量(0个轴),包含一个数。+ U  U. E- }3 T3 j/ a1 w+ j  ?' h

. P8 R) j. _. y( t标量在 numpy 中可以用 float32 或 float64 表示。, L  h1 ]1 d. h; I! H

) `' p4 o. F2 G: v; dimport numpy as np1 j) `% p' q, X! j

" R" ~( @& p5 R& q7 K" Kx = np.array(12)
# d9 L: B( T" {  a, Ex! F" T( F/ B$ v- @  T* m9 b
14 u) R3 ?2 h; P0 R4 x% F
2
, {3 m" R2 {8 n9 i3
0 l( Y! @. \/ q. c( b4 {4, J# A$ X3 |1 |2 o' D
输出:8 @0 z, N3 z1 U1 x* O/ [

9 p! `5 u( F; z* ^! larray(12)
7 l9 Q2 {3 Y2 n+ y2 V& l1
4 ?; w) \' Y4 s" Z9 q$ nx.ndim    # 轴数(维数)$ k+ h6 e6 `9 E& |
1- S" a( o: ]" u: @$ w0 M; N- x
输出:
& Q; i2 @! M# u0 m
4 B3 p  Y$ V9 `( p14 ]7 o; [: v$ ?7 j
1% V# D' C' S$ y4 H
向量 (1D Tensors)
1 c: `" @1 {% i0 j) ]) R( s. C
, W- P$ L9 }4 }4 z. ]# eVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
2 W1 G2 N& p2 q1 D$ I# j9 p! n8 F  M7 c6 b" X0 `- r& l8 Z; p
x = np.array([1, 2, 3, 4, 5])& C1 D1 d! Y3 R5 @
x+ R& d5 x! q/ \" a% f
1) p) u# d* f) F6 V
2
* ]% ~. H# H. [. ?  L; t  ]输出:% |" F7 s4 K  E. x/ u8 ^9 Z

  `3 |; \$ F6 c6 p8 G: Q8 x. y, iarray([1, 2, 3, 4, 5])
/ e  E; v  G% U) ]2 I0 K3 x: o1: ~6 d9 f8 I) h- [) z6 L+ _9 ~$ q* v
x.ndim5 n. p5 A4 M  T5 Y; ~4 T; f0 d
1
& L$ X: K; n7 M- ~输出:
4 |# q( B# _$ B% w( J0 D4 _8 H
: p1 Q( H( o2 U  x. v: d1
, o, a8 |: A: U2 y1
1 ], d7 e/ K$ @8 U我们把这样有5个元素的向量叫做“5维向量”。
- p2 ?: }& X2 z- c  s但注意5D向量可不是5D张量!
! I9 U4 E4 A! b9 B1 A5 a+ u9 B, R7 U+ A/ k" T
5D向量:只有1个轴,在这个轴上有5个维度。, `+ }/ b4 a7 h& P3 D" x6 ~1 j5 n
5D张量:有5个轴,在每个轴上可以有任意维度。) i0 @- j5 }, C
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。, _5 @  S* J4 K' i% b8 ^" q3 f

8 j2 Z3 P7 l* r; x# O所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
4 f9 n9 x8 Z. R1 C% w& P
2 @: c( |' s- ?9 ?3 S6 {矩阵 (2D Tensors)  F, L1 w0 [% `% u& I( k
4 }& O( z+ J- ?+ {  f  x' m
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
' O  q' ]7 s; R2 _$ V; _/ Q% P1 j4 A& g
x = np.array([[5, 78, 2, 34, 0],
8 a* G) Z/ b$ y# m+ Q' h1 v; V              [6, 79, 3, 35, 1],2 H# V" c! Y3 ?, F$ ]$ F( z/ K6 ^
              [7, 80, 4, 36, 2]])
) _! ~3 b3 r& u6 a. n4 D2 a  Ox+ r$ ^0 g+ J9 y+ ~& G# I/ h, ~
1
  Q* C$ Q% Y1 A3 O, m: z2
( [  p" l" N; T: ~; K0 Q8 f3
4 X5 i: x& r$ G% q7 }& _# S! p4# y) @# p& ]/ h) Z+ l" M
输出:  H. y# J: R2 z2 L% s5 l" b: t$ w
9 X. _7 V/ i  w% J* g+ [+ [6 k
array([[ 5, 78,  2, 34,  0],
: ^8 U+ b6 x0 R# C3 w6 ~; x- |" L       [ 6, 79,  3, 35,  1],
$ N; C% L+ H6 Q  C, S; o$ d       [ 7, 80,  4, 36,  2]])
: R0 R5 {. u, Q, `1) a- r5 I+ F. `: c
2
9 i- t% |; F/ X, P: I# ?3- m4 R" d" h7 }- O
x.ndim
+ [$ L8 s: }8 C1+ L- l, g- H- G5 h1 T
输出:
& }9 x( C% C7 x, i" E3 `/ w
$ g) H) T) h, F$ I+ f, U7 G2
! n4 n, e/ O4 r% n* z' O13 L2 o- C, |/ }: W; D
高阶张量' r% \* ?1 S6 E0 e- D( }1 p

* i* N( R, J7 [9 T你搞个装矩阵的 array 就得到了3阶张量。
8 z+ f% }* y$ A! l- n$ p  D: W  b( w: w% l. o; p
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。" U$ i0 q9 f4 Y4 v
! {$ f" v' Y9 g$ |4 _4 J% c$ U* Q" \
x = np.array([[[5, 78, 2, 34, 0],
- |  U) |0 o  ^. l7 h               [6, 79, 3, 35, 1],
$ V6 E' _; @# z* _1 o8 {( _# q               [7, 80, 4, 36, 2]],: b* o; P- ?/ L+ s# X: U
              [[5, 78, 2, 34, 0],3 N* W/ D6 }* D" q, }! y: Y
               [6, 79, 3, 35, 1],
  t1 t* F4 O& d  M  k               [7, 80, 4, 36, 2]],% m- Y  }# B/ C, B6 P  n4 z; ?
              [[5, 78, 2, 34, 0],
5 N+ r1 E& S# Q               [6, 79, 3, 35, 1],
* G* S8 x* q- `, n               [7, 80, 4, 36, 2]]])
5 w; S  J3 a. s' U# ix.ndim
9 o, ?8 r6 z4 u  ~& ^% V1
9 K4 F/ ]- k9 Q2
) ~0 B) v+ l; d0 e3
9 n; y; z! [  B: ]: Z43 E6 G: J- Y! {+ _
5  z! ]2 Y, z9 f! L$ u+ t" t. r
6
9 [2 }# s% c8 V4 H. h2 ]7
* `+ X! u9 T7 l, O8
% z9 }( J2 r( w8 J! t9, U. A7 c2 N. E- ]9 F: e
10' {, _- ], L% g( h
输出:1 X, ?& I5 L0 S* P2 ]

3 v/ e4 p0 u9 C% i1 O3  _) q7 T! w8 f+ X8 P
1
6 X8 E1 G) P9 |2 C- O0 m" V深度学习里,我们一般就用0~4阶的张量。2 B, K& M7 O! H7 W

( \/ a7 A( ]# o* }; P张量的三要素
3 W! g4 `7 X! v5 `$ ~4 a
! \5 ^3 t$ p! q阶数(轴的个数):3,5,…
( Y/ H) f% g0 m形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
# g! d# _2 ~! e/ r! E. d& \数据类型:float32,uint8,…$ C0 |/ u5 U3 [) _  D" i% e: @  v3 w
我们来看看 MNIST 里的张量数据:+ F* {! ?5 ]. r6 I/ K; B  ~

/ }* U6 B! ]' W5 _$ m" y2 h, x$ Afrom tensorflow.keras.datasets import mnist
) X1 e: b: {+ R% V( ?4 A+ q/ Z7 T(train_images, train_labels), (test_images, test_labels) = mnist.load_data()* z: ?- f  G) w6 N

0 l/ h" b5 B2 W- t  kprint(train_images.ndim)
) K% Q6 _+ ?9 F' |& cprint(train_images.shape)8 `& h" x1 I( h8 f, f8 n) H1 ~
print(train_images.dtype)6 G; d, M6 k. \( T
1
; J0 F. z. \- o/ F+ F) y, c2
# o9 k( u# q# U( g- {3
  Y! Y6 H1 e/ H" l0 B. d4+ C7 ~" i4 ]8 h- T  n3 ?! y
5
$ X# [, j; m. d7 r  b6# L6 W& H  P" F. s: s
输出:1 u: l% F1 t7 P6 E* o

0 J8 ?$ p% }7 D8 O: n+ J  Y3& B5 X$ {3 G3 }' g
(60000, 28, 28)  q. E* o# k" T; M; H
uint8
+ e+ _9 `& S4 y9 a& F; V  _# P1
3 Q. m' l5 g3 e6 K- z- n3 W; L2
$ H* o5 k7 [+ ?( o8 J' L" w3! Y  q) d9 P6 w4 e# O
所以 train_images 是个8位无符号整数的3阶张量。$ U0 Z0 p4 v8 N3 v; |3 W8 Z

8 `2 Q: N4 v7 m  g, a# j2 H打印个里面的图片看看:
3 G# S0 m3 }. h4 w! _
# F3 ?4 Q1 [9 {: }5 Q% xdigit = train_images[0]
( `3 A% ^* J/ ~4 L- K
* J- d& n& r" o2 Limport matplotlib.pyplot as plt
0 q, R, }5 I: \
, A/ W) o7 H/ m6 p7 Z. xprint("image:")
& A1 {" `9 T) w( V2 m: y/ aplt.imshow(digit, cmap=plt.cm.binary): f5 M( i& n9 t% B8 e0 S
plt.show()
+ Z9 Q* |4 {" o) Qprint("label: ", train_labels[0])/ O6 t/ P6 e& |6 X' E+ v2 \* S7 i
1# M8 X: ?4 D1 |. g3 w$ F1 I% a" g
2+ [. I8 v; Y2 {: H8 \6 N: @
3
' `8 F( a+ ^8 K( @6 s4
! E+ @4 o( Q4 `+ C+ v) D54 p) ~; i' d4 z% s- b
6
# ?% [6 b8 T) d& r: {3 _79 l+ [* M8 g. X2 w: @) E
8; p; ]5 o1 }1 r7 B) k- w9 H
输出:
/ C" U/ e* V& z* U& ]  w7 K5 c  a$ u
1.jpg 4 n) B* x, j0 d4 S$ I

% n6 [+ j5 N0 J; I" nlabel:  5
7 a3 v5 U. E: m" e) q( R1' X5 C. z9 `8 G
Numpy张量操作/ _- Z* m' ~+ [  g, F4 B3 ^

( W3 A6 O( d8 f8 L* O! E! R张量切片:
. v& m4 }8 s. {# a" v
; j6 n" `% H7 C7 A8 Nmy_slice = train_images[10:100]8 K; A- l+ v) r5 j6 t
print(my_slice.shape)
+ {0 m9 V) q$ m- }! {1
/ A7 l2 G2 N+ d, T( i2% N4 V% v( A7 u! l; g
输出:
, O4 D/ W: v, o 2.jpg
2 X1 I- ^7 z* ~1 Y(90, 28, 28)4 w4 S  ?. ^# y  E( J, v
1& b8 M  `8 l; m
等价于:! ?2 p3 O9 e9 O

8 e! s, _4 B, U% k4 t+ n3 M' ]my_slice = train_images[10:100, :, :], d) k1 d9 {3 G: S6 j- u, U+ R
print(my_slice.shape)
8 @9 q* j4 Q0 g. D$ Y1: X5 d* f& C. w6 c
2
4 Q3 H/ A6 }# b! s输出:
+ c# _# n# H' c: m9 i% c 3.jpg # Q& R; v4 d$ k* X5 r3 K
(90, 28, 28)
5 Y* _6 v3 F. W- ~1 M1
$ D6 D) z0 @% e* R" M也等价于
& F- T, O$ @4 u$ |+ F8 O
' k( w  I6 s4 L( Lmy_slice = train_images[10:100, 0:28, 0:28]4 ]6 q* D/ Z( e0 @" q# a& l
print(my_slice.shape)
" o6 f) b; q, \7 ]- M1
7 P3 h6 V  `" c4 W1 V. q24 k9 S& O( I, d( t
输出:' f; K; A! y$ l6 b/ ]5 c
1 M9 R6 n# {) V* w, h7 K7 C% e1 b
(90, 28, 28)
1 j. x9 h# R( c. h& H1
6 N) s2 L7 M9 W$ Y1 \- V% H5 [选出 右下角 14x14 的:1 w: N1 r, S6 [% D6 T; k4 k8 w5 D

" X# ~8 D  L% f) P3 b: [my_slice = train_images[:, 14:, 14:]5 j$ A, k6 z: v4 G- J
plt.imshow(my_slice[0], cmap=plt.cm.binary)! C9 U/ [% y0 b& b6 l4 d, Y+ m
plt.show()7 m' Y$ B" n4 o: {
1& H2 Y2 x- k* n3 D, C/ f* O
2: Z: R4 W/ A& J! A: ^; Q
31 u: q# d% L$ W" [" @6 M
输出:7 d3 S* |5 Q$ n3 m+ z& ]. L9 n

0 \! E4 y6 P! e* f: p% I% y0 y6 x: k0 }) {/ @) G8 I3 w
4 v% p! i4 t( r2 n+ g* W
选出 中心处 14x14 的:
  D' S" q. V- d
3 D) ~/ b$ S& J' K4 ?% fmy_slice = train_images[:, 7:-7, 7:-7]
5 S+ M. p4 y( p4 x. D& ]plt.imshow(my_slice[0], cmap=plt.cm.binary)7 T+ s+ f; u: Q/ n% R! v/ E' i% a
plt.show()3 {+ C1 N: B% Q& m
1" C1 e  d2 {3 n: e' u
2' A$ P6 I5 H& r$ x% U
3
. ?! {4 y/ d! @: J+ x% }. R8 t- c8 @输出:
! f8 \8 y% N& a6 e& u' @
) k, _! D. K, ]3 m0 A5 t" f
% j2 W: w1 l; u' P3 I  O: }) i1 s
数据批量
! B0 d1 o# O* L! i( |5 s" W* P6 |# N. A5 P
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
" u4 W% K5 q4 c. z' q
" i2 T- W( }# A* n+ R% o深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。7 U5 [- b/ d& D- @* r
# ]8 \4 F" v1 O& a3 @$ y
在 MNIST 中,我们的一个批量是 128 个数据:- H% `+ u/ ]0 G; P  f4 X7 P

* i2 p- H1 @" F; ~3 c* v# 第一批
- U6 L( f( o& sbatch = train_images[:128]$ B3 e+ B$ K+ A! k+ F+ _& C9 n/ |5 _
# 第二批# W6 U, J; H! r2 D
batch = train_images[128:256]4 h4 k. v) \! [
# 第n批
7 c3 J# Q# `, }7 g. _n = 128 u9 q: [4 I/ n0 T
batch = train_images[128 * n : 128 * (n+1)]9 Q. b" {: B7 Y1 ~4 X9 t3 ^
1
+ ?2 L* v+ _  j2( A9 X7 j' I6 w7 @( {
3: l( G; h( Z  w: u/ J' D- @
4
8 Z/ v* q4 D% [5% R8 {9 J9 T2 _; R+ `0 L* i
6
3 S% E& ~+ _. O/ H) n* G7
8 \1 v+ l( X, U6 k+ e( ^7 F3 \3 e5 l所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
" v4 a! r5 \4 H
2 k' S" W0 ^* k# j3 a, w常见数据张量表示) k& g4 N; o$ f7 N) G% x

# @: t( x2 q2 O- i' F7 k/ P( J: I4 G数据
' `0 a; |0 c' f" a( c
作者: 2863358207    时间: 2020-5-12 12:11
好好好好好好好好好啊发表回复
7 o# Y' T$ B  t7 F/ P6 W




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5