数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-12 11:55
标题: Python深度学习之初窥神经网络

( }4 a) `3 F& @8 TPython深度学习之初窥神经网络; y# Z3 s' U) ]  h
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
8 ^, Z) I, h8 o) t, s; A1 b- ?0 k# v
本文目录:/ V; C" i/ n' v( k

0 k" b3 t& ?3 W# T6 q9 P! e( |文章目录7 B$ X& U8 n& V* o0 Y
3 X% f9 R: u/ d2 O! A
Deep Learning with Python
" H  r: Z$ ~4 F2 e5 E初窥神经网络2 c0 |1 n2 q% \/ R- e6 z
导入MNIST数据集1 b* F# t: f0 R" w
网络构建" P+ z" d( O; u0 R5 R0 W
编译
! J* y: C6 X" h- _6 G) q预处理
& x$ M% H  Q& y* ^3 p( H图形处理) `; S& z8 {' ~  ?. b4 W
标签处理
9 W& g% @! t# Q- u4 V& H  g% `3 N训练网络  _1 I. W# F4 O7 L( O
神经网络的数据表示! D2 u& f$ x; z. C! S
认识张量* F/ z# C5 r. E" h0 J2 x
标量 (0D Tensors)4 [' \7 Z- [4 r0 s* m
向量 (1D Tensors)
, n) \+ F' F1 ~. `矩阵 (2D Tensors)) o: L# N; v$ M; E
高阶张量# F9 F0 y6 e* ]& h7 \# ]
张量的三要素, p" M2 t* q: N( t1 F; A/ \9 j
Numpy张量操作6 X7 F3 [! H9 R. K& B( e
张量切片:
, b- e# z  I+ p2 K* r' _数据批量3 p& j" [8 E% F- b" r0 M
常见数据张量表示0 n* [# I% J$ Z  e1 K- X
神经网络的“齿轮”: 张量运算
, ^7 ?. V; n: C, W6 U逐元素操作(Element-wise)
, U/ _3 \; V8 c" ^广播(Broadcasting)# P* l7 u* w& m/ W
张量点积(dot)
0 h% i/ \6 c5 A' E7 Z/ x张量变形(reshaping)" m+ w. Z6 i/ G8 {! y4 R
神经网络的“引擎”: 基于梯度的优化
) i4 n8 p, S! @0 x7 H5 r; `导数(derivative)
, _' T/ v0 ~3 L  c梯度(gradient)& \% P4 S( S2 e) v* d
随机梯度下降(Stochastic gradient descent)5 A) t  P' D9 u$ |, O* M
反向传播算法:链式求导. f# _2 T" t* u' S2 b% X
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。/ P5 X: u$ S  d+ R9 j3 [+ ]
; K' }6 [6 K* \2 b
初窥神经网络
. k. u4 |( ?1 R  v5 K$ H
" C& X9 D" L- x' Y2 ]学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。6 M% i9 m  H, c; l/ f

, t7 X( k  Y# [7 y2 A6 S; pMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。& u$ h: @1 K% ^. A/ K/ u+ u

. b0 g* |! I7 h! q1 a+ j导入MNIST数据集0 \# M$ U: j2 T' K. ^
1 c+ C. n! a$ M) H5 ?0 g
# Loading the MNIST dataset in Keras, U+ {& d! i" r& a
from tensorflow.keras.datasets import mnist6 ]; p# A/ E# j$ ~
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()1 O4 U# Y. h6 N+ q5 J; ^9 U; a
1
/ z" r3 L) W3 ?2 Y* Z8 `! ?9 O2
4 L# u  ]) }5 f: z3( i/ ~3 U' e0 B0 Q
看一下训练集:6 g9 F9 b* \1 U2 y2 K
2 U/ ^& X( T! V7 y8 ~
print(train_images.shape)4 n$ b; \$ n  ~/ N% b
print(train_labels.shape)
( o. V' D8 u( Z8 |: z! [$ }train_labels
! ^4 g1 j( z2 D19 N, q- `+ j1 @# n6 x: I
2
- ^. C) J; \) ~' b- k; z3
! k# K7 L. v4 c1 y$ U. D输出:
2 a# R0 ^3 C% ]. k7 Q$ z1 x% S
2 o% v, a" t0 I3 c(60000, 28, 28)
2 Z. l. R7 c3 b6 n. C3 b0 I(60000,)
# j# r. Y2 n4 l7 m  l1 ~7 e, b" L: t3 ^* d( E1 }+ m! B
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
. C. l: T2 \9 {" U+ V1# L/ Y' D7 f  t+ J; Q3 A+ ]; D
21 r4 @* O8 j+ z! B
3
" B& X) O0 r2 N+ M" X47 H6 _3 C9 L$ ]
这是测试集:
# _/ V) v) H% G9 H/ M/ u% x: E4 B4 s
1 I( B1 V/ O# F9 }print(test_images.shape)5 O3 \; ^+ ^; S3 \* f4 s
print(test_labels.shape)# u2 H$ n4 S  N+ Z/ f# W! x9 q
test_labels
5 C; k' }" C6 ^) v. _' h/ c6 m4 \1
/ n0 F$ ^) I2 ], e5 ]2% [* E2 v' J+ ?
3; l5 `" T2 S* U6 y* U5 {5 r) ?
输出:
$ \1 ]' A" ^# b3 R; x( G& T! {4 m" {  r9 H% K# N: L
(10000, 28, 28)+ c& M9 F1 ]* T
(10000,)
$ r/ R! B$ C/ A( [- {% O$ G  H; ~0 l, z
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
* z, i  `* Q% @) n: j5 a+ F' U+ B1+ E$ e4 V# `8 @: U0 h
2
* X$ p/ F3 p& K: @) g3  _8 j, N2 \' T( ?: e
4
" t( a+ A, F2 U* J' b1 J网络构建
' ?" a- M- b" F
7 h  L* W& K9 [0 D+ \7 g- C我们来构建一个用来学习 MNIST 集的神经网络:
1 q& b' E9 u9 {( o) S4 A. u; V$ y/ Q4 W
from tensorflow.keras import models6 Z( [& C' R* H" a+ v* Z7 \
from tensorflow.keras import layers$ I8 s/ ]5 I+ h& N

* Q% ^. ]8 k/ a; Q. {network = models.Sequential()
+ P8 Q8 O' D/ _network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))! ~( L, i7 x+ _+ z4 k) n1 i& w
network.add(layers.Dense(10, activation='softmax'))
) @: Z8 V& F% }8 Z; D- B- Z1
+ h6 v& R" _/ }  L& y2
  c$ `  K, F# F1 y3
3 V0 S/ i0 G6 _3 y- |) X41 ~) f/ o2 u. B" R% m4 `: \' A
5
4 _1 d0 h9 k! A5 G3 S  k1 J6- `. S3 `; e5 Z' g5 ^/ T2 V
神经网络是一个个「层」组成的。. j* I. v) Y9 S; H3 s0 k8 `! ~
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
; `1 M4 F% A7 o9 L4 [+ O0 a% b1 V* n8 D1 X$ f5 d
这样一系列的「层」组合起来,像流水线一样对数据进行处理。
( v+ K8 s- h: |" O% r/ R层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
9 r/ z: Z/ G) i( B
8 A$ H& F3 n$ `0 P1 y我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
6 @3 J; s, g5 W$ u& q5 y: N7 M' _3 n6 u, U4 G& E  I# T: A
数据到了最后一层(第二层),是一个 10路 的 softmax 层。
- A- l. ]& C8 A) R, {# G5 Q这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
) [; N( ]; D* h; ?& i1 |事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!# ^3 r, U0 q/ ~% j( y: G
: R2 r9 I7 J, ^! ?( T8 A0 l
编译
! V6 z/ g* |% H6 W, M0 p) ^! p6 K" o6 j$ f
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
; P8 H+ I2 p, D9 E* x( A6 E$ X: N' k% p6 N( m- g- \/ S, }6 e* N
损失函数:评价你这网络表现的好不好的函数7 G. t3 X) _% ^3 C: A7 R  S
优化器:怎么更新(优化)你这个网络, Z& C4 \0 s5 `1 j  T+ @* J( f& t
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度1 z7 y1 O) J6 ~
network.compile(loss="categorical_crossentropy",# t. K$ t- e+ a2 Y! u
                optimizer='rmsprop',
& ]+ v3 m: }( A2 n! d4 @) L                metrics=['accuracy'])
+ x* P3 w- z3 A1( G* r) L% t- }- m
24 X. D- g! n& S/ o9 L" d( w
3
3 F1 O) [9 X# e& a! ?- z5 O- a* y! @预处理/ K, r. F, V& A

) k7 k/ N* Z) ^9 ~5 W/ K图形处理7 v8 O6 P& b* k2 M. Q5 N9 ]% A( E
5 [8 V9 ]! T" F! z( U
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
4 N# p3 {6 Q3 @( T& G( E' O2 k. r$ Y/ l2 w: P# V: c
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
; U  }3 V+ e  S4 x% v7 |7 j4 o而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
8 i; Y' O8 a- x$ b  [/ c5 _# C( S" T1 U' I8 A
train_images = train_images.reshape((60000, 28 * 28))
. }6 I( k5 n1 n7 d0 r: {train_images = train_images.astype('float32') / 255
) |) O2 v2 r, q5 U3 H- y: _( f, {0 I
test_images = test_images.reshape((10000, 28 * 28))
8 Y' S; W/ `% m0 v1 W' R4 `* B) Y7 ctest_images = test_images.astype('float32') / 255
) s; r5 D+ Q$ w. }( R1
- |% x# n6 w8 M5 g6 i23 X; f; z" E' P# R8 p6 G" e8 _
3
# s! y- `" K) j2 x- s& G45 A. M) y6 t0 p
5
6 m" P" y% J" L, B; l标签处理
6 B' y6 w" ]( M7 \# w5 t4 Z
5 {8 [* H3 O* J) a9 _# L  y同样,标签也是需要处理一下的。. p5 h# H/ X$ g0 `* v# A
9 x9 M3 x9 o% f1 w) T8 Y0 g
from tensorflow.keras.utils import to_categorical
) _+ i; E9 G8 u% J5 O- i, c3 N; Y
train_labels = to_categorical(train_labels)5 K, I/ w- f3 I- Q( d  f8 ?
test_labels = to_categorical(test_labels)
" l) K8 d3 R  F( _6 f2 c" S1
2 c5 R- O$ Y6 b: l8 n& r- L2
! B+ y8 j8 M/ Z. {. T3
- i, J0 W- C: f; d4
% U$ d1 h  u' j1 N* {: D训练网络
% B+ o+ P1 ~+ o
$ V$ L0 [3 s8 o* p# m& U; }network.fit(train_images, train_labels, epochs=5, batch_size=128)  w+ `; |# {$ Y2 s" ~1 e8 t
1
- u& O. s" I8 G) ]  i3 x% N! ]4 L输出:) {- H  u& v3 e' ]# w- N0 m

; h7 K5 I# `! iTrain on 60000 samples9 }4 F# H- f. V& N9 L1 A
Epoch 1/5
; k6 Y, L/ ]) K60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
0 ?( Y; T5 ]! G1 W) Y& AEpoch 2/5* s* O& _# @1 g4 P! A3 Q
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
7 `# b* q. ]: }( z1 s( _* hEpoch 3/5
9 c  u  U% h* s+ _+ \60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800' t: q, Q- b1 e
Epoch 4/5
' v; N" O; s- w1 @0 r60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
4 d+ P6 q) K2 Z3 X5 h$ |: |8 \Epoch 5/57 R, _# d9 W( M# H5 n* c' y
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98885 C6 c) N; F1 L5 [6 X

4 x4 y# Z' C1 A<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
# S: h4 V$ D6 R$ }14 v4 l6 M( J: P! t
26 Z8 Y4 b; o; v5 F; y& o7 g
39 b6 m2 J! N- _1 c) n8 ]* L$ R, k
4
, C+ M% q0 j% G& k5
3 ]& F0 G; U$ C5 k& W6
1 G; g7 K8 a; l' D, b0 S9 R7
: M1 k$ C' {9 D0 M" S+ y8# z. g3 Z3 A: B2 L$ M% C8 e8 R" h
9" q! ~; G- G6 H: C2 ]3 N* ?! Z
10, y  z- l* _4 Q9 n- O5 v( A
11
% A, ~# p1 n$ K* l6 ~4 L12/ p$ K. ?( j8 y
13' u0 n) S* ]8 W8 c/ B" v3 T, q
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。( a: p/ s) c3 ~$ D* |; e4 G& i
; n* {) b; [$ W% @
再用测试集去试试:& c" \( d, p4 r  k+ y3 d8 r% K
9 n* a2 _( a: {# T* d
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) [+ ?$ \/ y" z6 `2 x7 E
print('test_acc:', test_acc)8 c; u: ~( o$ d. ?* D& }
1
) g. M1 q5 [6 e( l20 T; A* }! r- Z+ d  I
输出:
" \3 E" ^0 H( K, E/ ~; E& f( t( U3 X* u
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
1 ?, _2 }8 s8 s- B+ a$ Ktest_acc: 0.9789+ m. t1 O  F" e6 `
1
* b/ o: X7 }+ r2 G, b( V7 L2
* I5 `1 [/ S5 c8 K2 J: W, g8 Y我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。& H" M6 L/ D$ [+ J, C

5 B& k. y7 c! N( r- f9 W% t7 z神经网络的数据表示
2 y0 ]# `/ C  J" k
' ?0 s& L" a2 A. s4 @9 xTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。# m9 c- }7 k& E5 Y* s
% [; x6 K4 O; k" E( D& T
我们常把「张量的维度」说成「轴」。
9 `& i2 m% w7 c2 k2 F! }# K  B! [
认识张量
9 u3 }% H4 K1 p5 y: A, B: r2 @2 b4 [3 e0 [$ l0 I
标量 (0D Tensors), {- @& A% y$ S- k9 X

; |  @, |5 `2 o) s  M5 |) zScalars,标量是 0 维的张量(0个轴),包含一个数。
! |+ p3 \3 L/ Z& ~
2 s0 n2 B+ K8 ?- v7 G% r1 k标量在 numpy 中可以用 float32 或 float64 表示。- I6 f$ e6 B$ g4 m4 k
  o6 o. d+ S8 D6 O1 J
import numpy as np
9 y7 r" f0 C9 y
5 P; O$ a* ]" z5 k" x7 c7 bx = np.array(12), M( b, O& ?% [0 I6 e8 A
x
3 N4 ~7 L& }2 X- g! s! d0 Y8 R10 Y! R& B) w, p, H) L  d  K
2, H. y0 x/ m/ R* H+ r6 d
37 ]# w6 x% k# b1 s  F' j8 N3 c' H% `
4
' r& z2 M' ]! `0 m输出:
* M, R7 ]; s9 p( @. _6 ?7 |+ R$ `& Z9 s5 ~# Q
array(12)
/ C3 a# o1 r! a1
: T9 A1 B- M0 b* J: ~x.ndim    # 轴数(维数)+ V+ \! Y0 a6 X" N
19 `% S) |+ |9 l0 O& O/ e
输出:- W2 _8 @/ x  B9 O& ~+ r

5 [1 w) E0 i6 S, Z17 ]9 C" f# g9 B) O
1
' m1 Y$ d# {# n% u: l向量 (1D Tensors): a  \3 c3 C# h' V3 ^4 N

* F* v" x4 F! J2 o6 H8 I* wVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。" I) Q' Y1 _; O6 `* U6 v' I- O

( d! G; K' y9 @x = np.array([1, 2, 3, 4, 5])
# A* ^2 U4 U- d/ Yx
) y. `$ N$ z7 K( E# }9 f$ y$ \3 K1
% O9 k* s* W/ ~  }2& U) `- D5 b. R2 ?* D. c% o
输出:. J5 I$ q, Y; B' i9 k# ^' s
% @; Q, @# m  f! B6 F7 p& G/ G- q& [
array([1, 2, 3, 4, 5])' @$ A; L6 B! U: i- d8 X9 i2 V
1
+ K9 k0 K# v& D. w% l4 Sx.ndim
2 a" ?! z' h8 W1
+ Q4 _3 K4 x% X. H5 N7 W) |输出:
8 C" M7 O6 g9 H3 q; U$ u& t
( Z# R# N# P0 _1 l& D) X* X' R1
: k; ?) |5 {2 B9 R" ?) z& z# Z1( Z- I; e- @1 {6 w' v& ?
我们把这样有5个元素的向量叫做“5维向量”。
6 C7 p5 ~* v- w8 B( G但注意5D向量可不是5D张量!9 _$ B1 f+ i' O- w4 l+ G# T5 y
9 @; w6 O4 r& S9 y
5D向量:只有1个轴,在这个轴上有5个维度。
# B7 g6 B. F$ }' {' r6 j5D张量:有5个轴,在每个轴上可以有任意维度。% y. E) U* @# o. n
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
4 w! p" O+ w9 E9 Z& m6 U, w; w* N1 A% D. _* f6 W
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。* ]! @* }" E! l/ k+ G6 g( @

7 A& ^' t; y' {) U/ z矩阵 (2D Tensors)
! P3 ?: }: r. E) G! [
7 t7 G& ~; |8 o3 y- _Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
  ^  G% K9 s9 U+ }; Z
9 A8 K$ E! d; Z' J5 R: px = np.array([[5, 78, 2, 34, 0],
; D: a3 C: R7 Y4 f  a; ~( `              [6, 79, 3, 35, 1],
: D8 K1 f, G# W% @              [7, 80, 4, 36, 2]])
9 g, k" a$ ]$ R+ F. }! Sx
$ e' y! G3 Z% X: n1
# q% R: ]: T6 X. W2) J2 {3 ?# @0 |/ A
3* P5 K3 h5 y% o$ N/ }- u
4
* C4 d7 Z) G7 n# e6 V8 E输出:
, e+ f) ]  X& l7 [0 u0 [
- E; D1 g, F+ \% [' varray([[ 5, 78,  2, 34,  0],; y; R8 j3 ~! y- y: c
       [ 6, 79,  3, 35,  1],) W% L& E* K* O; F2 w& h* m/ j& I+ a
       [ 7, 80,  4, 36,  2]])3 U( X. J8 @! Q0 s4 R% V
12 N: D% R' V$ N6 V) |" w
2
9 r; |  i6 |) S3# x7 n& h/ h% k
x.ndim0 r% V* k$ F" b) q
1* z8 v( n, ~( N* X) X  n
输出:
: j4 v* |) p+ f9 g! d$ W  p  x8 n: a0 `% ^" @4 J
2  C. K5 d* j. z
1
3 l' O8 O+ g' S高阶张量
& }6 z5 X- r) y& }0 o8 \$ l' p2 I) y( k. ]
你搞个装矩阵的 array 就得到了3阶张量。% |6 [+ ?/ i7 {! l

7 o0 S/ O) V, Q$ J6 A; n/ ?再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。( n$ p2 \5 S: g7 s* y
: I6 g1 N/ J( F. y! H
x = np.array([[[5, 78, 2, 34, 0]," }, N5 t( l; C) e6 x) s
               [6, 79, 3, 35, 1],. c9 @" u9 k! h& l4 H/ d
               [7, 80, 4, 36, 2]],) O8 x9 U8 X3 `
              [[5, 78, 2, 34, 0],* g) U0 P1 ]( `, C7 O3 i2 ]4 N# y
               [6, 79, 3, 35, 1],
6 s- w; ?5 [4 i  Q* z8 g* t: p               [7, 80, 4, 36, 2]],/ q! x+ ], y- u0 M/ E
              [[5, 78, 2, 34, 0],
# `8 R, g* S8 Y! Z& p' P               [6, 79, 3, 35, 1],
0 n  ~; S' q+ I               [7, 80, 4, 36, 2]]]), F9 Z# x+ M1 Z6 s' M5 _: f( a
x.ndim) Y$ V9 C$ g$ o& O, B5 W
1( b- c2 q6 n  X2 |( n3 W
2
, n, C$ ?, @5 e  c' m: ]3
5 P( q/ O8 h* n' \49 S: f/ A! H( K# `; q3 M+ B
5
, D6 u4 c, I8 W/ r6
8 w, V" x, J2 [6 f& f1 C7  z( T$ j( j( i% x) E7 G+ Y4 }% x
8
  F0 v6 U% G  O1 v6 v98 f- |/ f! X! _1 K4 K% y8 X* ]
10, e8 S* Q6 o3 a0 }! ?
输出:
. [6 s- f. t# P7 c# r4 A
* r% C; u+ l$ I% P' `! t5 X31 d% Y. E% e+ z: F2 [
13 f+ M! g6 R, \. i- u( s
深度学习里,我们一般就用0~4阶的张量。
# l2 B+ r# @. v7 K6 ^
, w- T2 i# X9 d! l6 s0 h! H# R/ P张量的三要素& i; L/ J, C9 f# _" u
9 g. @/ {8 ?3 B8 }* k3 @( t
阶数(轴的个数):3,5,…( A9 X- Q6 Z0 V# S3 d/ k- U
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
2 Q) |6 f0 ~: R% c数据类型:float32,uint8,…
  {% _2 ^7 g; U; n' u我们来看看 MNIST 里的张量数据:5 S" \- O3 I/ M9 K+ Z. p
  t3 N9 t1 m7 ~$ m3 {; ]  t* I
from tensorflow.keras.datasets import mnist
3 `* H. {6 G- _% a# X1 x* ^(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
4 [/ k& {/ D, x$ M8 _# O2 F
) {& s' f! C8 \8 A( }" e! o5 ~print(train_images.ndim)
- n" q* {- J& v5 ~8 Kprint(train_images.shape)7 x  u9 [$ n' {! j) I( m
print(train_images.dtype)) ^+ d( i) U5 N+ @; Q5 t
1) a  M4 F; z1 s; p/ ^9 S, I
2" \1 Y: Y2 F+ L: L
3/ E! h$ X& s  t% ], ~2 E
4- ~5 h4 }, w8 L3 ?& \0 n& Q
5: T$ F" d- C& S! S! p. `
6
. B; x" B5 a2 x. \, j输出:
4 D6 N3 [- s6 K2 b* c
  q0 ]/ r& [7 f: v/ i4 p# X3
/ M& ~1 g7 K! ]$ x(60000, 28, 28). G. u) P/ N3 C
uint8
* ^! z# @4 R6 L# X1 k) C& w1
8 L3 ?: Z4 o! x( B2% N! P6 L% L- k  v( \! M: V9 D8 L# U* D
3
( `1 i& K! p1 b3 F( R- o$ b/ N) g2 r$ l所以 train_images 是个8位无符号整数的3阶张量。/ J" ^) [8 k5 W. W8 u5 K! ?
3 a8 d) [. A" M( R
打印个里面的图片看看:
% `' s  c" V6 a: t$ g9 ~
% M. i) @) t9 p" _, A7 s. {1 idigit = train_images[0]
  S% h3 V! A9 u' @1 R( R
" g% X" \4 M& g; d+ s# zimport matplotlib.pyplot as plt. J/ B5 x1 R4 A6 J

; P9 L0 `- }. X7 Iprint("image:")
& ~' W0 {% ?- {6 t" @' bplt.imshow(digit, cmap=plt.cm.binary)
8 i6 W7 z# o. X% L* \plt.show()
% n; {' d  I$ P) ~: |( w9 z( [print("label: ", train_labels[0])$ j9 F: _: }' q: ~0 r8 [1 \
1
; u! X6 Y! K" x# [5 \5 A$ q: M8 f2' @5 m9 M2 a! [( J
3
- O5 Q2 D/ l. g/ O% s4
3 W: ^1 h6 ?+ z4 ?  m. \5
2 o6 a, c! o1 n  s, H60 ?0 X" a1 @% D6 J& t- ~
7
8 n/ }' X1 Z5 y8
8 c/ {4 N$ P7 l6 F1 ~/ ]/ p( Y; d输出:
- m! Y* h( r' N  d* ~6 I/ n. x( R- w3 m3 u: ^& h
1.jpg
4 G5 X6 w$ U7 A
2 z, H7 y( ]- E* G( S* a8 |* vlabel:  58 V2 X( s" {( b7 V
1
* w+ ~' u5 ^3 k! FNumpy张量操作
* O* o$ K  h- E/ o
  y3 g  g) B% C  _2 p张量切片:
$ K; V& Z3 J9 A+ k* {0 w
* H2 H- p3 b. C% Tmy_slice = train_images[10:100]
. l4 ~  B. y. j- a- Q" e, lprint(my_slice.shape); h/ A/ M; p+ W' l+ v. |- }6 P0 R! ?; X
1
# y% k3 g# x1 E20 y2 ]: g( b+ k  s; d6 T
输出:6 G( I+ y' u" [# ^8 [4 m
2.jpg
4 L/ X$ l4 v0 m% ^  ?% s0 E9 \  @(90, 28, 28)
9 |8 q' X5 o$ _1
+ L6 C, L5 |/ }0 i$ t" U: P  M  p等价于:( X3 Z' ]8 ?2 G+ w5 X" {0 l

. I; w0 n' a6 Y( Y; |0 A; [. jmy_slice = train_images[10:100, :, :]" q* \  @- l1 p' }# b" \+ V5 E. i  U
print(my_slice.shape)/ ~# E# X8 r7 X% K- D; Q
1% H5 f! Q0 q$ s" R
2
* Q, L5 O3 }* r# D. n. m输出:; C5 O7 ]# Y) ]* \* |- d
3.jpg
, |* m" {( g2 v. P(90, 28, 28)) [: P  I9 i2 s* W
1
* [% `9 e, `! R% v+ S+ o0 V6 j也等价于% t# y% _# Q7 l5 \9 |

% k5 n' V4 I* K; R3 q# ?my_slice = train_images[10:100, 0:28, 0:28]
% {) _$ V% U& b+ j) M1 B, Bprint(my_slice.shape)
4 ~6 I( p' P+ V9 z3 G1
7 }7 o: F2 {" p' b' j4 Q2& O# x5 W8 W9 E) {& D0 p6 ~, k  }
输出:
* v, b2 _, V# U; R$ H5 k
3 Z" R) d" m  v1 d4 ?/ @& k- U# Y7 D(90, 28, 28)
) A3 r- t. T9 Z/ m# {1
1 W8 x# B7 R2 O5 [选出 右下角 14x14 的:; c% i7 O* G) t0 L6 p3 G( V! p

; U* u, n2 [3 e1 Qmy_slice = train_images[:, 14:, 14:]
' C+ Q+ ?* S5 C8 F: `' W* ]) Dplt.imshow(my_slice[0], cmap=plt.cm.binary)
* ]% [- e1 D! X: O  Z1 n. Kplt.show()
! p9 m# _* {) Y# J, I1
3 k) D9 h. L. S1 Z22 I2 x8 o8 X" a9 t
3$ L9 O( u: ~( D* w9 R, J
输出:
: }9 s, S! ?5 X9 B' O# u! |! J8 H6 e8 O

" `. a( h$ Y5 k1 A# s8 n/ o+ j) V2 g! }. K# i* x5 M' D
选出 中心处 14x14 的:
" e* J: Z* j0 Y8 p
' J# m4 d# T; u8 P0 V. \my_slice = train_images[:, 7:-7, 7:-7]
9 @9 H) m0 k# q2 U4 f1 R; X1 uplt.imshow(my_slice[0], cmap=plt.cm.binary)
2 }  C. {, Y# H9 ^6 X9 [! V6 v' pplt.show()
0 R) k  r! R! n; F1
+ Q) M* o+ K2 y* W1 ?$ S5 Q+ E2; h$ M' i# j5 N. p
3& Q# c7 J* u0 g9 ]* z  M+ D
输出:
5 U1 }- r) i( v) W
2 t0 z7 B! O: @$ m4 f- `2 E* k3 I, l8 l" y" u/ \

. ^  D; t4 H3 g% S数据批量( a4 H$ e. N% y5 R" B- U5 j( z5 Q

" e9 ]! L- s% |1 f0 [% p深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。( c: R! }6 _6 D+ h$ s
! O' N; L/ c: a* m1 _- F
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
  L' @# P8 B! f" J
: H4 `9 W7 S/ i0 O在 MNIST 中,我们的一个批量是 128 个数据:
  k- v  t- M+ f4 m( f1 m4 A) F" K# |' c: e0 Z
# 第一批
) H4 g) U. h6 ?5 A( nbatch = train_images[:128]. f( I6 _( Z6 Z" {
# 第二批
+ }/ {/ [6 x" e8 Q  Nbatch = train_images[128:256]
5 y  S% N3 b* z: G$ ^  ]' K# 第n批
1 V: ?4 C! i- X$ Vn = 12; L7 I* `. ^7 h) t
batch = train_images[128 * n : 128 * (n+1)]
9 o) W1 f* f% T; x5 H8 W  B5 m4 H' |1
  A: e* v3 y* i5 Z2 h0 w, K; E2$ n  f& N9 S, `" H5 D  b8 O' Z6 c
3
! g3 G, k: v0 E* p4 I+ T4
6 G% ]5 e% q" X9 O, j2 ?6 }59 y: s6 ]6 L/ W2 ]6 _3 C0 W
6
1 \- v- f( y2 P4 t: \( q75 E) Z: A" Y; Y7 w. v- H
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。. N9 @) h1 G! ^( n
5 I9 M. Y0 t" b0 x. g  T  {, u
常见数据张量表示' o0 w7 k: n! v0 y+ M
9 R; i5 h2 W! x8 o0 x
数据& b' [% O( N& k  e+ q2 K

作者: 2863358207    时间: 2020-5-12 12:11
好好好好好好好好好啊发表回复
0 J( }" s% G9 U+ G& ~




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