数学建模社区-数学中国

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

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

& O9 {3 ~+ ]7 X3 }Python深度学习之初窥神经网络9 h: F6 q! O0 A7 Q, f
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。' i  f% V* ^, X8 ~- G( f. b& w
0 E6 _4 V0 z4 i1 B1 }' h) P4 h( E
本文目录:$ C% S( u+ ~% x' B4 [6 P# q

% v' A" E8 O) i' t8 N文章目录
3 _6 X& \) i, `
7 Q) `. E- [3 u" c8 `0 k, g8 `Deep Learning with Python
1 i( p& L* k5 r# B初窥神经网络
9 Y! i: P3 j) L( O$ D导入MNIST数据集1 K2 Q8 Z0 u$ s  j# E: J
网络构建
5 j7 ^2 j, k! n+ b# e. G# b编译# G8 P+ }  L, _! U
预处理
( D! e; V$ u$ f1 m; x图形处理$ ^/ r: v+ N  k" a
标签处理: }7 \+ j) L0 C" e! v# o, b- v
训练网络; n5 g$ h3 \4 I% Q) R; D( b
神经网络的数据表示2 o: N9 c; N8 R7 o; T
认识张量$ ^4 B6 Y: L" n/ ]( B1 e1 u2 ^4 O
标量 (0D Tensors): @5 B% t  l5 J: B6 j
向量 (1D Tensors)
) p* ^, T/ ?% i/ ^$ }矩阵 (2D Tensors)$ f1 e3 a) K, M
高阶张量4 w" E- @4 c: G2 R/ }0 t
张量的三要素
5 w7 h% l, D7 ANumpy张量操作
2 j- b  m. z9 O* O张量切片:% x- C9 o3 _& _) I( C% _) T3 V
数据批量: w: t, q  H1 T# A% x! Y
常见数据张量表示
; ^: c/ n  y& w, U) ~神经网络的“齿轮”: 张量运算
& }' R& a2 p) ^' H9 J逐元素操作(Element-wise)
* N- ]" A7 d$ u. |. c  j广播(Broadcasting)) p! B7 u* K7 [% @1 U6 W
张量点积(dot)
1 I6 X2 g" ~2 r+ W8 K张量变形(reshaping)! X: W( }  u! L' g) V# b
神经网络的“引擎”: 基于梯度的优化
& T1 l# s% v7 W$ y6 }: x: H3 f导数(derivative)
) d! N: H$ l2 i1 H8 ?6 }$ H9 `梯度(gradient)
% t( X  `, w" C/ ~随机梯度下降(Stochastic gradient descent)
# w. ~- D/ T1 g* `: _7 u8 A& `反向传播算法:链式求导  x; u4 I1 a% |0 L
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。! a; i, @( z6 d2 {/ |4 g

; E$ }( b& s8 s/ }, p$ ~% }初窥神经网络
- C7 _1 U% Q) n( K( t& m4 ^+ }
, Z/ D5 h9 b; t0 t2 p9 g. K学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。8 n, |3 t8 c* X' k. g$ o

" i+ F4 X+ p+ m" t+ u: \# {0 ^% uMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
3 H( v" x! _/ y% Y9 ~) S0 x0 U
  \) C' _8 W  h  M0 A* v导入MNIST数据集; ?; N# |5 g' M' B' M% @1 n

) R% X9 g) i2 W( N) m8 V! _' W' ]# Loading the MNIST dataset in Keras
8 j4 _2 ]( s5 w5 S8 z; ofrom tensorflow.keras.datasets import mnist& Z# N+ t7 t" q  R3 m, @  @: c
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
* Q! x, Q6 Y9 j/ O8 v* T' M9 _1' X. u4 C* c$ L) \
2. r2 {& [8 @( |) B5 j! Y
3
7 g5 p- D% T+ @+ @1 B: N  d& s看一下训练集:
' w9 J$ m0 z+ v( k! S( a7 A( ?4 Y6 ^) T7 V( W+ h5 b/ n$ j8 i$ |
print(train_images.shape)
; h# W7 w1 w: L6 i5 ]2 Nprint(train_labels.shape)
. f1 ^/ T. _8 v  ytrain_labels
' }9 k' z. @5 ~! W# J" F5 o1) G# b/ D$ C4 s6 Q9 C( E
2
4 U) [- ?7 {/ _  E9 N3
, I# t$ |1 k# x4 k输出:5 R& n' r# {' `: N- `0 t
% }9 z# {' `" c
(60000, 28, 28)
6 I# H/ [1 W$ `7 L$ L(60000,)
) c, [( T, }. {. J5 Z4 M* d) T! C% t3 v0 A( n4 |1 q% D2 h, E
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
8 P0 |9 V7 }2 y! [1
0 b  r& }4 ~8 F+ x; F' q& ~2
, n1 f  ~# C7 [# z6 E3
. @9 I: J' z+ D( E2 e4
8 j( I1 z) s9 d# y% U4 k这是测试集:; R) f" Q( C+ k2 L1 ~
% @7 ~) |' S4 a. c
print(test_images.shape)
5 t' W+ c1 ~, Aprint(test_labels.shape)
$ _: A( Q' `) \( Z( J5 ~( ]# ^test_labels
# t' C9 N" H4 R; p/ b  Y- L1
- L& j7 h  a# c: b+ m2
/ P4 j4 b% K" I5 r. @: f3
. R( {* x7 h: d2 w; C输出:
% ?0 s" `: x' W1 C7 W& k. A8 ]9 }5 h8 Q
(10000, 28, 28)3 S% W5 U  H. ^0 f% A! v
(10000,)
; i/ i1 K, z. T! z# h, Q6 i1 j( a4 l  k
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
9 R: s/ F4 H( A' F& o; [5 a1
( S0 x1 f- ~. ^4 z( M6 p/ R2
& W; g/ d$ I0 U2 _1 _( ]3
. ~' a, L3 |+ B44 i7 \# K1 h' R$ {+ }
网络构建
$ Q. Y, W: u: u: j( s( w* K2 j6 D: A& m  p' Y  Q
我们来构建一个用来学习 MNIST 集的神经网络:( E1 V$ W( o, B# d7 ]3 l( ?: j8 P

" y6 |5 |; I8 ?# ?# C; J' Wfrom tensorflow.keras import models3 v( Y/ ?, B2 n  g% b- i* s
from tensorflow.keras import layers1 ]1 Y% o0 m5 a
; y% T- V  _8 O3 h
network = models.Sequential()* q7 e! U# F* C
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))7 d2 a0 W: b0 @$ c
network.add(layers.Dense(10, activation='softmax'))& {1 O3 x6 w1 k5 Z* }% }# n) l
1: K/ M* T' [9 Y" L
2
) f- s6 d' n+ F' P/ f3& D6 e# `3 z' B! \
49 a4 ^. r9 n- v# Y
5
/ k9 ^9 c1 L2 n# e$ Q6
5 ~% ]" i5 V; ~: u: S* F神经网络是一个个「层」组成的。
$ L) W( H. C# x; A& t一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
5 D/ v" v7 y# [/ z2 m, m
, J" E$ e: ]9 ]这样一系列的「层」组合起来,像流水线一样对数据进行处理。" k* e# `; A1 y& e. L
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
+ I) v6 h4 I/ g4 T9 l' L6 u5 `' \( i# O
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
) J: {, [9 T; F9 g. R9 o$ R& @( d4 v) T. ]) |
数据到了最后一层(第二层),是一个 10路 的 softmax 层。8 R7 F- O% ?8 u7 ^
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
' W+ P- \' }; I; n3 I3 X; I事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
: h) {" K1 Y/ U5 F. Q/ d
% S; r/ q; l- c# \3 e$ }编译0 i& W7 I5 A& g6 Q8 `+ s8 O
8 X7 v0 q* d- d7 {  f
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
$ n# s: P! c( R- W* C1 m. H/ \& a) Y  j+ [, I# s+ f
损失函数:评价你这网络表现的好不好的函数
; U; j4 \' g6 Z' f7 a' J0 P( r优化器:怎么更新(优化)你这个网络
! _  \2 o5 A" k- q& Q6 @训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
5 L$ k7 C8 E3 G) Qnetwork.compile(loss="categorical_crossentropy",, U6 S- a7 o3 }9 P( s4 K
                optimizer='rmsprop',
- }, v! i: s( g) I                metrics=['accuracy'])6 h3 `8 |! c8 ~3 A3 o
1
; A% k3 X- k( R4 f* v" K2# }3 w. \9 g/ |
3
' _* _( }) @0 ^& X' C- U$ C预处理
; W6 z7 a2 z& b& }# Z
+ G+ n! _4 k) k: Z图形处理& o9 R3 k  w4 u: L4 j: z

* J# \0 ]& y# K' h4 T7 i我们还需要处理一下图形数据,把它变成我们的网络认识的样子。: K1 V2 a1 ~$ r5 u$ x
( `( g! B1 e+ T6 {, u% n
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
7 I- z- p! Q; B" p( l7 R而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
4 i9 [9 s. x% O# }. U; `9 d/ y* u: W$ s
train_images = train_images.reshape((60000, 28 * 28))5 L" D# X$ t0 l2 W* A
train_images = train_images.astype('float32') / 255
3 e! h8 n5 \$ v  c- m' C3 W( A, q7 j0 d: \2 Q) d- v
test_images = test_images.reshape((10000, 28 * 28))
7 q- n, ]3 f+ \4 c! Otest_images = test_images.astype('float32') / 255
" ^- b: b  n$ Q+ ?. @' I: I10 H8 V3 L  _$ k$ R( H* Z
22 b9 A3 O) {9 m! p" B! F
39 H# {5 Y/ `2 Y( s; D0 ?8 L6 T
46 p4 |+ v6 V2 S; D
5
- t" t8 }4 }& Q7 Y2 o标签处理9 {4 `/ C. d/ K' _0 r+ p

8 M6 P0 U4 _; x6 z& I- s  }同样,标签也是需要处理一下的。9 v, u+ u' _7 t1 X" @

: l# n8 z7 P0 ~  [9 J1 @0 x& Tfrom tensorflow.keras.utils import to_categorical
7 n) y- _) h* L# e' D3 y& i7 q
2 B* c1 w. Y6 f7 d6 v2 [' ptrain_labels = to_categorical(train_labels)
" S/ ]: O# T, F2 v7 c  s/ ^test_labels = to_categorical(test_labels)
: p+ c0 n# O  c( {" q1
. W1 A2 M1 r" C3 R5 w0 b29 u  Y1 a: b( O' z
3. l/ ?0 d+ h6 q2 g4 a
4
) w2 X0 W9 o* m! \! Y7 H# L9 n1 v训练网络
/ R5 t' h  M( _7 V0 ^1 a6 z' F" M9 u. I( L
network.fit(train_images, train_labels, epochs=5, batch_size=128)
4 k' g$ z5 H! _1
8 P) f. |  e: c2 s# k/ A( T9 ]+ |输出:
8 D$ Z0 @( [2 f2 v5 f. a. E# i  T& h7 a; g1 v8 [
Train on 60000 samples8 `5 s/ n. V( G$ L5 `+ ]
Epoch 1/5
' {" r0 z9 f3 A1 O2 n60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.92548 _7 X) Y" A" m! U6 T0 h/ E
Epoch 2/52 P  t$ l; n, p; g8 ^
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693. \1 w5 |1 [- A2 _+ Z- P
Epoch 3/5' {' W" S0 H& E
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
. p+ k" v% |6 f9 O; eEpoch 4/5
0 L% y! W- Z8 B8 z% B) w60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.98484 H: S+ n. q6 n! Y) N: v
Epoch 5/5, b3 k1 I3 K2 ~) e; o
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
' n% l% E( G3 L7 V& n
$ u3 `& u$ t$ z; q" E& m<tensorflow.python.keras.callbacks.History at 0x13a7892d0>$ H) a+ z& C6 z2 S6 h7 t1 r
1. ]6 a  \& J- b% ^" [6 ^- ?
2
9 ~' N+ m& D# I3 k3
! B6 D; d1 I- b6 s4' i; J$ O3 g7 G* K) [, s
5
3 R, n! {; `+ c2 r! r! `6, o' v6 u0 h5 l3 [0 r- V9 d0 a1 m
7
% u) P& N3 i9 C, ~7 A/ _% G4 W8: x2 b3 h" z+ ~! G
9# m" o$ Z) b2 Y1 Z4 Q
10
' X4 E+ S8 j4 h11
8 l% h6 P! B( }12
+ W# |! f4 ^# L* e13
) ]% h+ j& W$ w: R1 ?9 M可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。/ N, J3 }4 u1 y

8 I# T$ y4 {) Z3 y7 J3 D; P再用测试集去试试:1 x0 w6 |! ]1 y4 R

$ N* f% e2 ^+ J- ?8 F; k3 D8 i1 xtest_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" X. d' i) d$ Q. u7 O+ ?2 M
print('test_acc:', test_acc)
7 M2 e. S0 c& N( ]1$ d  K- i  d4 g, S# T. a# O
2, E: Q( ]9 g  f3 z% ~
输出:( F7 s+ l6 Q# v0 q3 E4 g  a

: Q: n. ?4 V% v) u- r! `4 J, H10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
2 R9 W8 C6 W- i7 Btest_acc: 0.9789* j; K2 D0 G, B2 ^. {, C3 }
1
$ i7 o' [! O9 ^$ I, o. Q, Y2" b% N- X; S+ R. [3 u2 j6 w
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
) A/ l1 w3 a$ i+ h, ?( N# K
# K. U: ^& h8 P9 U6 [神经网络的数据表示, Z& F% Q2 W" x% p; {

. X* S# Y: D/ w2 STensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。2 e, a" u' \2 G, F; \
8 @1 w: r: z9 o" c  g% j
我们常把「张量的维度」说成「轴」。
6 ~& }! r; s, _5 M8 T7 k( n  Z5 I) T/ x
认识张量% @; [0 V1 M. g- b
1 q1 D# T& P0 n" x  E3 `  [
标量 (0D Tensors)
" K8 b  d9 m" C. p& v2 r, R4 c1 Q
Scalars,标量是 0 维的张量(0个轴),包含一个数。2 V4 f1 @7 e3 N4 @. {

, M/ l) P( x2 Q  i8 {2 H标量在 numpy 中可以用 float32 或 float64 表示。
  F: R) o0 Q' K& Q
+ D1 W% d) D$ limport numpy as np
) f- [, ~; K7 S
( j% S+ N! ]8 f: s# W# _# ?x = np.array(12)1 P+ m+ B' {7 }3 |+ ~
x
; f- t  _( _) o1
* C9 ~. ~+ A; q: n# H# i: r/ K2
. F6 C8 i6 x% u2 H* H/ H3
  e7 l2 ^! T: ]7 b5 [7 S7 F4
3 W' N9 f7 C$ x  U$ ^输出:
/ q6 Y& g; f! Y. W2 i) X1 x4 S
6 ]. b( E- [) V% @! g) t0 q) earray(12)9 H, F& Z2 V, d& t! R. q
1
# C+ m$ B0 k$ i" Jx.ndim    # 轴数(维数)  Q' f7 i+ u: t4 ]
1; `& s3 S. ?  w
输出:
) W: ^4 d  [# H+ B# E
9 v; ]/ f) }8 }& i# s6 |1
! W" ^+ e/ n4 X# H2 Z1
9 o: M$ m1 J6 J5 `1 e6 Y+ D; `( e向量 (1D Tensors)4 V) Q1 [9 y2 h' j5 h8 b7 K
& I+ S( Z; Y! ~! {( S
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
7 y4 P& k1 ~: E5 ]7 J
; F- y5 Y) N5 F2 c( H8 Lx = np.array([1, 2, 3, 4, 5])
& N8 Z0 `  n5 K$ p; I3 m( A2 hx
+ k! f+ j$ b* P8 f" S8 [1  J1 o& d1 `2 M- _% V
23 x) w# k6 D$ }) V7 J
输出:" Y  ^% _( ~" i  C8 I- }1 Z
9 Z  a- k5 B2 B; i) g
array([1, 2, 3, 4, 5])4 p: I* s4 g" z1 m
1
. U; U  V1 J3 q5 ~x.ndim
: `5 u  \  g( \- i$ H8 E' G5 n4 h& |1  H0 t2 t5 O' _+ k6 v4 Z$ R/ n7 x
输出:& ?  D; r5 P- K- q, L3 C9 X" v

* W+ n$ N, j) g, P/ c1; X7 l" `, N% p$ J3 ~/ c
18 ^% \: T/ {' B# K' D
我们把这样有5个元素的向量叫做“5维向量”。6 h. \- Z3 F+ ]7 X. l
但注意5D向量可不是5D张量!
) ~  G1 p3 Y# g3 W) C  y( U  C
( c# u% o" b) Y" P$ V& C0 H3 Y5D向量:只有1个轴,在这个轴上有5个维度。0 b4 K8 d: {7 O2 o/ D
5D张量:有5个轴,在每个轴上可以有任意维度。
# D8 s7 H+ ^. G2 [这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。' T, z" d8 U8 t" u+ E5 N- U

: \. ]7 y$ V4 ]所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。# W9 i4 S( a; [5 P& ?  T
" J9 }" v6 @( o3 d* C/ Y# q+ A
矩阵 (2D Tensors)  H$ j5 g% R$ s# x- k) a
. G: _. K4 X( r6 l( P1 j# B
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
7 `6 L/ m# b& C7 s* [8 x8 T  M( G
x = np.array([[5, 78, 2, 34, 0],
  G9 n* Z: Y9 E              [6, 79, 3, 35, 1],
8 o. R* G  t5 p, l  T              [7, 80, 4, 36, 2]])+ G( b: s; x6 F, @+ a
x" N: d+ u0 _1 C7 X" f5 r! K2 }3 ]
1, W  }/ |2 s: w: w
2
% ~8 ]& }0 U4 p/ D% \0 A1 Y32 D/ Y4 ^; Q' ]) l# g: N
4
2 W( w9 R8 M* \' @输出:& ^; _1 X. v# N' L. m( \

9 A' V. L& |6 i2 z! g$ Q* Yarray([[ 5, 78,  2, 34,  0],
& I" z. \" [$ X% M* O( H       [ 6, 79,  3, 35,  1],
1 t+ r( i, N' `6 _4 {       [ 7, 80,  4, 36,  2]])$ o; k1 Q; Q, W2 [
1
7 t; `% P6 F' j" u& E28 {8 U& D/ `# Y! t( f: \
35 i! f) z) S% {+ W3 z/ Y" I
x.ndim8 h/ t& K6 L5 p& B
1
2 |/ s, U3 M" I3 c9 N- S输出:* r- b: y" l/ T0 h
7 i. g! n4 c0 n* X
2& A5 Q( r: j' `, w; n0 ?
1
6 {9 F; Y- o; S2 @8 p& }8 S+ g高阶张量  j5 I3 r* o$ H3 M: H, U
- g8 W& S4 o" y! p
你搞个装矩阵的 array 就得到了3阶张量。
  ?& _! e0 R, O
5 ]9 _( X% u/ u; t0 Z& i& X再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
$ `6 E$ c1 R7 R6 F
; h! ?- w/ r( F: s9 r; r' Jx = np.array([[[5, 78, 2, 34, 0],* g5 }* u+ _9 R# W' e* @: z
               [6, 79, 3, 35, 1],
$ i, B% m( t9 V/ B0 C( x% x2 x' L               [7, 80, 4, 36, 2]],) y( I+ N5 M% z, W( f# Y/ \
              [[5, 78, 2, 34, 0],
- j& G2 b$ l6 b3 q               [6, 79, 3, 35, 1],
6 d' `) L) c4 ^               [7, 80, 4, 36, 2]],! M0 @5 V# e4 [: q2 q" C
              [[5, 78, 2, 34, 0]," k/ a1 r; A( f1 a2 l# f5 P5 A3 p: Q
               [6, 79, 3, 35, 1],
! j; ~% x7 \3 E) \0 B               [7, 80, 4, 36, 2]]])
! F& Z7 b4 R- V" w5 X: X2 b9 s* Zx.ndim
; J- p3 P2 \' a" }; `# W10 D& Z9 N  X, t  e" n2 ~( C
2% J- U; B. g1 c
37 C' v7 f% N! d8 q+ d# G9 ?
4
0 a7 ^1 ~. T) i8 B5
8 A6 v) K' W- q; ^6
" k$ o* E, {2 N$ M7- M0 [* [. W) Z0 E
8( x: P6 Z5 f7 i9 g
9
, r: H7 e6 N, f10
- X( }0 Y9 j+ K  e  {5 |) Q8 p输出:; [. h; ]( S( _. h4 c& M$ _- D

7 ^! p- A; \+ F0 Z30 G  u& u, h! e9 c1 s: F% [* k
1
+ r6 c7 q9 g: x  B深度学习里,我们一般就用0~4阶的张量。
" _, q) f8 ~! R" J5 B9 w2 }: \, J* ?% k' x" O2 O
张量的三要素. ?5 j$ |7 y' v+ g+ `+ a" S

6 y; |* f- T: v7 G阶数(轴的个数):3,5,…! [: N5 e" p+ J$ u. _4 Q7 \
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
! I7 A6 K; S. F4 r3 ~& `9 m( U! D) `数据类型:float32,uint8,…: C& @! u( {8 @* O
我们来看看 MNIST 里的张量数据:
$ e/ b8 [1 n* A: L% a8 l
) e3 G: G' d; A3 Z, S- @from tensorflow.keras.datasets import mnist
" i& s4 ^$ n! B(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
4 S. e1 g4 z& q8 N( H
% ~, V$ J9 H. M* L7 J3 Pprint(train_images.ndim)
9 L. c+ g. w# D' V$ n8 Mprint(train_images.shape)/ J7 J' W2 J# E5 a
print(train_images.dtype)
( ?0 ~) x+ r! ?/ \13 q0 [0 U; d  J& }
2
. ]7 E4 S( v8 I: E$ Y. T3& ?( s# U* H; _* D6 e* G
41 p* x- x6 i, N, |2 Y, o- Y2 O
5
. [7 ^2 ]+ C5 G$ B4 c. r2 S6
* F9 a5 b+ i) ^$ U: L输出:
1 {( j2 k4 M" [4 n. D5 W
# r9 J% L. [% x36 E# k) J3 ^3 O- G2 T# ?
(60000, 28, 28)
% c. A! r0 k) o' q% Muint8
6 {8 w3 @) w4 h2 @. C! d1
8 \# ^% u/ {) n6 X* z1 H2/ k; y/ c$ U; O: q, z, ]
38 p4 |; G- P( Z$ Z
所以 train_images 是个8位无符号整数的3阶张量。7 f! t( ^8 }3 g- b1 k* p. V
' i; i9 V8 y3 \* ]* S2 Z
打印个里面的图片看看:
5 }( d, C" d( b7 j. C( S8 T  R" J  q
digit = train_images[0]
$ _! a$ h6 d9 g
2 a& b# k/ g0 [1 W  h; Y+ mimport matplotlib.pyplot as plt) p& i! h; y7 E. c) ^: W
  I1 z( Q- o% h& O$ j. A9 T6 `
print("image:"); n6 a  e* |# g$ O2 b7 e, p# |, c
plt.imshow(digit, cmap=plt.cm.binary)
9 {8 N0 k7 D- y7 [6 U7 {8 E% F1 qplt.show(): K8 g; Y  U( m0 W, H- S0 P+ k- A5 d
print("label: ", train_labels[0])
3 n3 x& i4 f# B1" X  {9 S% o& J& X" c: z0 e
2
! w, [3 r9 l+ o& R# ?: N' s; \3
6 i+ g3 V, \3 L! g9 d9 t8 x4
5 D9 A$ P% Q1 p8 z- x9 ^5 z7 k3 w1 l5
' ^  d; p1 f5 d6
6 K" B; M7 O/ m) y. G3 b! T7
- H* T7 O1 v1 S' g: c5 R83 x) Q, {+ k& j- L: \) \- D
输出:& P% m' I: O- S4 w3 w% M

9 @( b$ C4 W, L 1.jpg & i+ k( @9 r0 Q) O
% Z/ A. P8 x3 |% @' U4 R
label:  5
. r; Q  S* w/ S" p1 P1
8 X4 E: G7 L; z* D0 K/ O& \Numpy张量操作
0 B5 h! F( O% i2 |3 r% [
* P" J# \9 V  y3 n: v+ \张量切片:
- d1 {3 }5 K3 k2 w! }
; C& u- H0 D( {( Fmy_slice = train_images[10:100], H* r8 x& u4 X3 A5 a
print(my_slice.shape)" C( J) @- n1 W' u- X" N) n
1* R- r( N. G8 R4 R  x6 |
2
3 Z/ ]" I/ u4 j输出:
1 k: f% p/ j9 G 2.jpg % K. _- ~5 u& n- Y8 f8 C4 v
(90, 28, 28)0 ?& n" _1 I2 E6 H, O
1/ B* V9 a9 N5 u2 Z# [6 r
等价于:8 i. r" h+ B2 g
% P+ L8 {$ m' c6 |  P3 b8 ~. i
my_slice = train_images[10:100, :, :]3 T+ r8 u6 K  u3 l  E9 b
print(my_slice.shape)
/ q9 c. }, b8 s( c$ k) ~1
! x; Q* ?9 P- M  _6 c8 I25 q) {$ ]1 Q+ I! ?
输出:
1 |  i+ a; \2 i* w+ B  E 3.jpg
. Y9 r4 I7 g# R& O) Y, O  v(90, 28, 28)
2 h, h  L8 }- U. {) ]  N1
' b3 l, p# ^4 e# O, x2 G1 V也等价于
8 B' s2 @9 r% q. `  _4 I4 y6 ]1 G3 @
my_slice = train_images[10:100, 0:28, 0:28]* c; |* I4 z0 Y2 k  f4 v
print(my_slice.shape)$ g; ]( e+ K/ D5 k# K
1' |0 F5 v( P" K2 h$ p% Q
2% @/ l) D$ w( x  j6 \1 T8 _
输出:
" F: o* a7 c6 e$ L+ t: B- r$ N, \
(90, 28, 28)/ P" D5 {* @& j0 O! m7 ]% m
1( |" j5 Y- s  [* U* }) I
选出 右下角 14x14 的:" A- \9 ]4 u5 G
4 Y8 \3 b% v/ B1 k
my_slice = train_images[:, 14:, 14:]7 Y- y$ e$ H( \
plt.imshow(my_slice[0], cmap=plt.cm.binary)  M; N, c7 z% }$ s5 L- I
plt.show()
, G. Z0 h& [7 `5 w1
7 M' S9 Y, f% {! ~0 t3 X# k2
$ Y# g4 C1 W$ B- U1 M5 W- s+ w3# I$ N8 V) J0 I2 ~% W
输出:
& Z" ~* y7 D4 V. x1 Q- l
# |* }) `! T1 ~; e$ h+ i: q7 ^: O0 J  u6 y3 q0 v( I

( L9 k- M! k" k& H9 u选出 中心处 14x14 的:
; Z  |; m, ^; _3 v# S. x6 E
& i9 P- m/ g; C1 I$ u5 d$ {3 A1 \9 mmy_slice = train_images[:, 7:-7, 7:-7]( g5 p& B2 d  }( R
plt.imshow(my_slice[0], cmap=plt.cm.binary)2 s& ^0 W- g. \& Q/ _
plt.show()
5 b+ Z0 T) }! Q$ o( o8 q# _6 k1" S# i' H+ `/ j2 a
21 `* _6 A/ d1 ?  D) C
3
+ C3 W! q( {$ u7 y0 o- v! ?6 B输出:5 ?7 F9 y1 m) }$ e& q( @/ E

% [8 R6 ?2 b+ n' N
" A7 Z% d, p& B- l
# M8 S1 f1 L+ H$ O数据批量$ l& P5 l( s: J/ S

* [. X" ~& s/ `9 f. {& Y深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
2 h$ j$ P3 R7 u) g
" F; e( ?3 U: C深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
2 C* o, U7 |; u- i7 t& q: J5 V9 S3 f
在 MNIST 中,我们的一个批量是 128 个数据:/ _2 I- P8 i  E* s
0 ~4 ~( n% }$ e& h8 h
# 第一批% {6 a( N  R8 V
batch = train_images[:128]! T6 v( L# H9 y  G0 n
# 第二批2 s5 g# L5 H0 l0 V* n. E
batch = train_images[128:256]! i) K) E0 h" H$ j. w7 n/ `
# 第n批5 W: |4 a0 p% ^+ t6 k7 M4 U( I% e( f
n = 12
0 |' {& {) f' ubatch = train_images[128 * n : 128 * (n+1)]0 C: X7 y3 g2 n1 l
1/ {1 {- d0 V/ y$ R% p: y. g& C- q
2
+ `3 d; U+ g0 A  E' x3
$ P+ f0 Q" I- E3 M8 W! m4
/ x, u- e0 k. ~: x" @57 L- ]! E, m2 x0 i# H1 c
64 G1 ~: {0 F9 ^: l* _( L% Y( N
7
) K3 M' [0 r0 M' o1 _所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。, Z2 E' B. v7 E) t, E! y

/ j& n1 D/ @/ X# W3 ~常见数据张量表示2 P) x- m: v: I! ]
; ^9 D% {: S* X5 I$ s
数据; i- f8 [+ ^- D8 c! [

作者: 2863358207    时间: 2020-5-12 12:11
好好好好好好好好好啊发表回复
( p3 I5 O* `8 J# P4 X* a  a




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