数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-12 11:55
标题: Python深度学习之初窥神经网络
1 b2 P( ~7 j/ w( g
Python深度学习之初窥神经网络
! @4 U( e' U" s7 H  T6 R$ m6 R9 Q本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
* f4 |& G8 U. W# M) X4 j
& S8 U6 H! s. {  r' N本文目录:4 |/ P1 r, j9 q+ ?$ h$ \1 _
' f, M3 j1 y- \9 x, e9 \8 Q* }
文章目录
% |& t0 B' O; D+ R# C' M% a. m$ s7 X  t' Z  K
Deep Learning with Python
: Y' B1 `4 w( a; \) t# l% H$ B4 }初窥神经网络
3 z5 P& \. g# w$ X7 o4 X7 \8 w导入MNIST数据集- H+ F) S# P" J' ^! t  r( u
网络构建5 V; ^, ~/ d( p3 i
编译
+ A3 O3 O3 G2 S+ Z* x/ x预处理
& k6 _# B! N8 q图形处理" ^2 m. R; z5 ?
标签处理) X3 u4 Y+ M; w% O0 L5 W
训练网络0 W- K- i4 k4 l7 k8 {
神经网络的数据表示
4 G6 x% X; r. H1 l认识张量
( w3 A. Z" g, C标量 (0D Tensors)# o+ ?+ i/ {7 M, N; G1 L
向量 (1D Tensors)
% Z: {* ~- N" j' W* x: O7 o% ^' {矩阵 (2D Tensors)% \) @) u& h& }5 q7 _# p3 I& L, ?
高阶张量# V9 `4 t6 H# Q% N- l! c
张量的三要素5 g$ @4 j% A* g2 @2 Z) N
Numpy张量操作
. `, f; y$ a4 T* f张量切片:
! L% {. x" t$ V* g数据批量
+ B- ]3 Q, V: O4 ~( e4 V常见数据张量表示
1 B: ^' H# s9 o神经网络的“齿轮”: 张量运算
! R4 L( ]  H7 K& u逐元素操作(Element-wise): @' c% A( K" h0 ^: o# o
广播(Broadcasting), t4 w8 c8 Y" C3 G( o
张量点积(dot)
* g+ t) C+ D5 W4 x张量变形(reshaping)
# K( g$ I; p- X6 u神经网络的“引擎”: 基于梯度的优化
5 g6 z- g5 e3 E" Y! t导数(derivative)
2 |" M+ M) q7 h1 C7 d" M2 n梯度(gradient)
: m6 w; n) s, ], Q随机梯度下降(Stochastic gradient descent)/ H7 b$ _- z- J1 H# E
反向传播算法:链式求导
1 T1 ?9 k' j- H本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。! l  x6 x& n/ V& t
  c+ i7 N$ h! N. c+ X$ h
初窥神经网络
+ x8 g  M* }4 u2 ]$ g$ x9 y; W* s0 ]3 C& |' C- W
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。) n/ {$ }( z  Z! P& H) }; `

7 g' H2 A( z1 m/ |# rMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。7 o  G5 O  _, I3 g) W. }

9 y/ u- R" j; ~4 V- R/ a1 x- G$ H导入MNIST数据集
1 c$ n% R! e$ R+ u) w& x
  V( K4 U- m* n& I* ]# Loading the MNIST dataset in Keras6 k* G$ z8 G% O
from tensorflow.keras.datasets import mnist
1 ~; J' c. r$ C2 b. u# g1 s(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
7 v" t2 s; C- W: T1  F* d4 K, a: o8 b. g6 |
2
2 t  y& Q3 i5 k& g" n1 K3! ?# K* K# d; S& x5 D; X5 f  a
看一下训练集:# o8 H+ S1 ^1 l0 u3 x

" ]4 j9 \3 L' L0 q+ G" pprint(train_images.shape)3 Y9 |5 @- f" X
print(train_labels.shape)
; Q6 e3 o: L( R3 Wtrain_labels
: }2 a# j8 P" `; C* W8 \1
, @" v$ x% X+ t; h8 A2
8 V6 d8 ~( s( t* W( _3
* p. _/ D7 h: g5 Q  p9 M4 V输出:& R0 e$ n5 G' q* q8 X2 J/ B
$ Q( R7 u" q6 m  P2 F3 i
(60000, 28, 28)
0 `. P5 I0 F* \. c* _7 o# C  \) g(60000,)2 w3 w+ Z- W& Q1 `, v  @# L6 t

" ~0 Y% x* D3 k# i  @array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
3 X) h8 Y0 t* G, x& q1
) C) Y; ]' U5 k3 v' Y1 g' Q, C3 E, ~2
8 ~3 J4 F  o" X3# R4 E. G# A0 }; G. [
4
& M6 j6 @* i7 G* R* `! j7 m这是测试集:
( t8 V, M' w( p6 f: H% \2 y! T; ?. ?/ g- D4 u+ l" Y
print(test_images.shape)
! o7 Y8 U3 T+ k6 p' S! qprint(test_labels.shape)
% X: Q. P3 j3 z4 p, C" Jtest_labels
2 D. {$ i: B( h8 d, q1
- v: |5 H0 |9 y! j5 ]  }27 z0 A" E5 G, @( m7 v
3
0 Y& H+ h! c  g) p3 u0 ]+ q* t输出:7 X3 N& ^& s: z2 [, T1 l0 b

9 @& u* m6 b9 w' B+ a2 w: m7 T! G- R- K(10000, 28, 28)7 A% J. B* e. S& `1 O2 N4 E
(10000,)
. _9 e2 c6 ~( |$ Z
8 V: w; G  k; m' [4 Carray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
& K; n! R& [4 x/ Y4 P- Y1
0 ]+ N2 y& q. J$ b$ S2  Y% o- J# u; a2 _
37 w5 j$ X* z  o5 k! u2 e9 X
46 K' [- }; L+ i" _+ h8 j( s
网络构建
" j5 L2 ^3 L; k. K# [" A1 S+ M' B& k% F9 z  V
我们来构建一个用来学习 MNIST 集的神经网络:
7 n$ h9 X" N. a) H: r
5 o6 v! q, ]# Wfrom tensorflow.keras import models& f$ z$ @' Q: F' B
from tensorflow.keras import layers
* X' r* ^, [" ^- O9 c* m4 R
  A& S+ o/ a$ {! x3 m* B" }network = models.Sequential()$ y& G6 I( u9 k9 x/ @
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
, V1 ?$ |3 L, ]2 \! `network.add(layers.Dense(10, activation='softmax'))
& E9 `! I2 K0 w1* o6 ~$ A/ d' t; Y2 Z& z" R9 b- K  D
2
, t9 b# T; w1 ?1 `' Z- s3) s; i$ `0 _, P6 w
4
% g& L0 G8 q( r5/ N0 w5 @- ~+ ~# P
6
* Z6 B  ?5 T, V* V神经网络是一个个「层」组成的。
  Y5 E+ r1 s1 C+ q" \一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
9 E1 r* H7 Q* {( Y5 p. [% }
, @% L7 i$ a0 x7 {0 G: A# u这样一系列的「层」组合起来,像流水线一样对数据进行处理。4 p: R% Z8 J& H
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。9 W6 ~" O! X* d/ X
+ O+ D3 p- U. r4 N$ _4 r
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。# L- J! m+ [) |0 s$ l4 {
, L/ ?9 ?# k* L
数据到了最后一层(第二层),是一个 10路 的 softmax 层。8 w! k8 K3 |5 Q: N6 Q) w5 Z
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
% z5 p7 y% a! J事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!$ u+ D7 R" `6 N+ S7 S8 f8 v

& q0 g: {' c8 j7 }  r2 }. x6 [0 T编译
9 W/ I5 ?6 o, [! v- Q' x- x& ^! l" j/ d- Z4 k
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:! |# Y/ r# l2 T' n

  j3 @; z" ~0 R5 j  o9 }损失函数:评价你这网络表现的好不好的函数
. I% b# ]* N; A, n4 r# P优化器:怎么更新(优化)你这个网络* [- b( o, H7 e7 I1 m- N- i
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度4 T  z; Z& g2 F$ ?( [: j
network.compile(loss="categorical_crossentropy",
2 G# b$ S: R- {4 {                optimizer='rmsprop',) v# ?' p$ q' l& b' P% H
                metrics=['accuracy'])
. @; Q2 |$ {' T+ U5 V# M* p4 M12 T- ]% \0 |) V* p/ z
2" u2 T: l% |) h) M7 `- |
3
; @0 V4 I1 d. B预处理
0 C3 G  ~9 G8 {* G! O
* o, N! s, b0 ]. @5 V3 }& b7 K图形处理
1 K1 V/ v" d4 {/ H1 l. P; \8 b+ A# d& M7 T
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
( n2 V0 I, ?: x& F4 a
) @' F! M+ A$ w/ f4 k% U' WMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。" d' \7 l/ z9 |5 @* g. |, v
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
' Z4 ?- g9 o8 D  d- `
; F1 C, i( w. {+ ^train_images = train_images.reshape((60000, 28 * 28))# {3 R1 {& X; e+ n9 m$ B/ P* b
train_images = train_images.astype('float32') / 255& z  y! ^" I* Y+ x2 z3 V6 u
& d) K3 p7 N5 J% Q( g
test_images = test_images.reshape((10000, 28 * 28))
  U- W0 W/ A+ ?) r7 Qtest_images = test_images.astype('float32') / 255
1 g  @7 x' z4 ?/ X# e1" C7 W; _& p. `  J& f9 a6 q. s
2
$ [$ g+ Y* Q  M3) l  a* h! h7 h1 {/ u- [
4
8 u6 u+ z$ P" x- j( c5
& D( d& P/ v- s6 d标签处理$ e( q4 L0 t5 Q+ R3 ?% ~

+ q; }$ U+ b7 @6 d. G同样,标签也是需要处理一下的。
& C9 E# i; G9 `  C& M% g" g1 a* M9 ^
from tensorflow.keras.utils import to_categorical
$ k: r5 ~2 j. i$ ?+ v: M
* M% u( l- `. S! Ftrain_labels = to_categorical(train_labels)
, B& i& }! z# j$ `5 U) k- B! ctest_labels = to_categorical(test_labels)
( S& H# h7 `( T8 [1
' _( i( ~* }4 @2 X2
/ S* [: R& M$ E# a; B3
) N: k( s3 s5 ^4
% \  ~) p$ r$ |/ Z0 E训练网络
+ f6 N4 s- L+ w5 I
& M- f* |9 d. ~& rnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)' i6 v& V. v* ]
1
; w: V. c1 y, M输出:5 L' D5 o' v2 ?- I* T3 U. |

* o4 H$ |$ E$ LTrain on 60000 samples! G1 k' a% W, I: a: J( J- {' B  a
Epoch 1/55 D4 G$ q/ L& n! L' @7 p
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254: n9 @5 ]: B" s
Epoch 2/51 T7 ^5 t8 @; T( `4 \  D0 N8 ?' E
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693" `0 k' R; n: H2 B7 u7 |
Epoch 3/5! a1 N0 F" ?4 Z( W$ G# v
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.98002 d( O7 V$ h8 U; X9 E3 K; B
Epoch 4/5; H# J& R/ b7 x
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
! Q# N3 T) v' \Epoch 5/5
/ x9 R( g4 I# s7 K4 z, x60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
! H0 O# M2 [: U: r" W% t- r, ?
7 j+ m& `. p% W( A8 D<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
& q4 R1 w6 v( l5 _1
1 O4 Z0 {; M0 ]$ ?8 K* c: O2& q' g2 |8 S" m- w
3
9 H  x, i& H6 q3 E8 V49 y( \( C. s, t. s$ l# q" Q
5+ O# O: [8 a  {- Q  m/ n
6
2 C, P0 \- \- \5 D. s1 F. _7 X71 i, y, ]) l  X6 F; o, `
85 z- [% c- d  A9 M$ c) Z' c
9
5 V, E* f+ \( b: g7 O6 a- A+ t* ?10
& r/ k% i0 R: d2 d8 {119 g9 S: ^% V7 d- ~; F
12
* |# k+ @! R1 _. V# O' m9 F13
7 q0 u8 [6 M' \" C可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
2 r. m8 J4 Y+ u( k8 J, ?1 e; _% ?" _3 u( V% N7 n3 [
再用测试集去试试:- R" i1 @" y9 Y8 m  W
" c: v( b, y* h5 ^  F" I3 R
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
/ `  t' f7 ]5 d2 w4 u% {5 @print('test_acc:', test_acc)
' T5 v# G# d. ^; i4 U15 y2 Z$ x  x- ?/ y5 K$ l
2
1 ~; L( ?+ a& O- z* W输出:
# M7 `1 _, ?) ^8 A0 z( E* ]% f, p3 d" Z
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
, v: g5 v5 p6 y% r" C$ b$ Btest_acc: 0.9789
$ h4 c3 K  {/ H1
3 k5 Q; s& h/ q  {. s25 Q/ j6 I$ e" `4 G
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。' B& `6 k, Z# J
; @- b! z9 j; K
神经网络的数据表示
' l. }$ m# R( I* q9 G) ^2 b9 Q5 M: ^4 s
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
/ X/ O6 ]# S7 C9 s" J0 x# v; U) Q+ V( ]( Q
我们常把「张量的维度」说成「轴」。8 G; M. T9 D1 g3 t# L

7 C/ c$ j8 \* H- S7 G- N认识张量
; S7 C1 C4 n  F; E7 z1 K  k5 O) L. ~8 o8 [2 P- t0 Z% O
标量 (0D Tensors)
4 m9 o- w7 `. @/ j' ?) ?2 ~
9 [/ j$ {4 c2 ?6 K6 U, IScalars,标量是 0 维的张量(0个轴),包含一个数。8 x+ H% h0 i: N& C

$ ]! T6 G. @- H: g$ m' N, g* w9 O标量在 numpy 中可以用 float32 或 float64 表示。0 P4 c9 J' `, x, B% J+ ]5 O6 p
* b$ a+ Z3 E2 [6 s
import numpy as np! X+ g+ ]+ _. I4 ]- p

* |0 r0 @. p4 D2 `5 ix = np.array(12)
. ?4 Z& T, A1 R2 h! l+ Ix3 W+ P. G; c6 v, Q+ C8 ?# T
17 D: P$ W) E# D8 T7 G
2
1 v# i0 i# R; R! g. v. O; ?+ b4 k- _3# A5 U6 k6 s9 g" e8 L6 [3 }
4  j  w" G( J$ o7 \' g) v
输出:7 B; S% R: l5 ^- h. B0 j
: Q" T& p" p. n
array(12)
% I5 Z+ L2 m' [- Q1
2 j3 t% i, A4 W* E  W0 h, G' E- ?x.ndim    # 轴数(维数)
: o- W  ~/ L  ~( s1
1 N% C# G( Q* s& s, z, F) U- p0 m输出:$ d0 f$ e  t) E( y, r

1 o3 f2 Y% w9 `3 U7 B$ h$ l; @1: H/ r4 `$ {( h3 W, p# y8 T
1- z& [- }& k2 @) R: b
向量 (1D Tensors)
! R& z" |0 q; y2 g% p- y/ H0 t1 R* C4 E7 Y2 @0 @, D8 l
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。- h. a& i% X, ^+ k1 v
3 q1 E" U) P! [& {- T0 k, G$ R
x = np.array([1, 2, 3, 4, 5])  l$ Y2 X2 U9 O% @% u
x! L0 h. \, A0 W' G. U
1+ a' f. k9 m, P  u, ~' Q
2
* D$ B$ p( f* B9 o% t9 s3 e  [输出:
2 {# I; z: C! e4 r/ h
/ }+ r# B& \; p) Uarray([1, 2, 3, 4, 5])- x: c2 c4 }/ ?& i# j& ^
1
4 A- {% a1 W: u" O) f6 G, Bx.ndim* _- W7 g% j; Z# i  ~
1
0 ^/ ]* ?6 @4 y0 F5 X输出:
% g) d$ r) F  x) d* b4 Y: h% p4 T2 P4 ^
14 v4 z' U5 s- I
1
/ ?+ e, W% S6 b7 i我们把这样有5个元素的向量叫做“5维向量”。7 V1 Q) o: O. ?
但注意5D向量可不是5D张量!
- D) c) W9 f& i! W; \( y% O- C+ E7 G7 s: b4 n. J
5D向量:只有1个轴,在这个轴上有5个维度。, u/ ?8 J6 i- D" g2 d1 \2 W
5D张量:有5个轴,在每个轴上可以有任意维度。
, k( y) |5 U7 K) r+ U' R9 @这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
, h1 q+ n/ p7 _4 @5 T: I( V  U- I4 ~. J
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。" R5 |2 R7 w9 C0 D7 F
' a. o8 K1 c2 f% @8 o
矩阵 (2D Tensors)0 O* r% C2 t$ J) X$ w7 C% H

$ F' ~$ n* S7 yMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
% l1 a0 Q' ^5 `
" y# {4 K( r0 i! V( w6 yx = np.array([[5, 78, 2, 34, 0],
/ Y; W3 Q* s, T              [6, 79, 3, 35, 1],
1 e# e1 g1 Z4 a( T3 ?              [7, 80, 4, 36, 2]])
7 M' u" _/ K6 e" y8 v0 fx
! c6 s5 @4 U: H1
( b$ z' G( p& A+ A. d( m& j: n2' q# u- u; N/ b0 V
39 L3 I, U' z9 T
4& U# R% S# ?; q4 O6 X! [
输出:
. b/ S7 P& e7 J1 n
" j& v% ]% b1 l6 G' x3 ^+ z) Oarray([[ 5, 78,  2, 34,  0],
. r4 c: e" [2 ~" I       [ 6, 79,  3, 35,  1],2 h! ~6 R; N7 g; j- k9 ]& ]
       [ 7, 80,  4, 36,  2]])3 i, ]: z% n: p& {
1
. ^* a* n: u. O: Q2 _" H5 W2. v- {* x8 O, ~% M
3
) Y6 l8 P+ t, i7 Vx.ndim
/ v$ `  i+ [' ?3 r1' f2 l5 `  D. Q: y( @* H
输出:
6 {0 @2 S! }/ A' w' C3 c
$ o* E$ [1 I/ @2 r- G$ C7 a2
+ i/ B, w3 a! @1( b0 ~( w& t! [. w/ `+ x8 r
高阶张量2 E9 ^) b' B  L! t2 ^

: r$ b* D/ t5 z& r8 o7 r) k你搞个装矩阵的 array 就得到了3阶张量。  Y: H; q/ F1 Z+ c$ |  T$ ^8 h- N5 W; [
/ M5 ^; K! @$ b# o! Z
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
" U8 t2 E) g; d' F# z3 _0 n  o, b, ?9 a0 Q. z' K, i: h1 C+ P6 |, ^
x = np.array([[[5, 78, 2, 34, 0],9 o9 `. X8 ~: K( B
               [6, 79, 3, 35, 1],( j0 g5 M$ j6 Z7 U
               [7, 80, 4, 36, 2]],
/ v# b) A9 l7 N0 N( A1 ^, K: D              [[5, 78, 2, 34, 0],
$ N$ w# A7 @! E, v" \- A. l% u               [6, 79, 3, 35, 1],' q8 P$ U1 k$ P2 i8 ^
               [7, 80, 4, 36, 2]],
! r- E: g$ y) ]' C0 B              [[5, 78, 2, 34, 0],
  Z0 o6 @+ A6 `: f" H3 y% _6 ?               [6, 79, 3, 35, 1],
6 U$ n6 Z0 V' x, _0 K4 w9 g( Y- G               [7, 80, 4, 36, 2]]])
! t; R1 N- p9 x6 Y2 L' \- Tx.ndim
' Q/ h" B- m# s9 q1
$ Z3 B1 [; l" P4 m. s! T2
8 p, M1 d$ o: l$ ^9 d$ d3
2 r; g- R; ]4 |( C4
" E7 ~4 z* K1 t9 m5
  G0 s0 |' B3 Q9 c& q6
( g- M1 t" }; S# _5 @' n* w; Y7, n' c+ F4 g7 j) v8 G: G
8- A! Z% d: Y$ w/ U% J
9
1 l! D$ |/ Y, U# e! |1 ]! G) G10# G3 d1 ?- Z: W, H' }. P. e
输出:8 ~0 P1 I" b: v6 ?% @+ n& P# z2 H

0 ?9 G( O3 W* @8 X; E33 N; I3 `' v2 S, R- u
16 Z* v* K* Z$ q/ ?7 s9 }
深度学习里,我们一般就用0~4阶的张量。
$ m* [5 Y6 u& t: F" _+ d
) |) h6 m9 m, D* ]1 x9 G* k8 ~张量的三要素
' d# I5 }- j" k8 w2 W+ n9 M5 y7 s4 \! l- x$ D% e; m
阶数(轴的个数):3,5,…' z5 z" i, C' K6 }1 a. C
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…" l$ X/ s" g2 t$ I7 ?  v1 I
数据类型:float32,uint8,…3 B' E, b8 {8 r$ i) X
我们来看看 MNIST 里的张量数据:
4 y% v+ j7 u% L, }( O. ^& _# K) m% K7 [' O3 h+ f( B
from tensorflow.keras.datasets import mnist
0 w( K2 }2 ]- w6 R(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
( V8 @9 R0 B" `: A% |! o- j  D2 D
print(train_images.ndim)
0 _( U' E5 P6 Vprint(train_images.shape)
6 U1 J4 Z9 M1 n0 Aprint(train_images.dtype)% V- u* ^1 }" B& H% B% @: K
1
' K/ c5 H2 L) w  G, |5 ]: n1 A25 U0 i9 P  q8 d$ R( k
3* P0 C) ?1 Z2 @8 s& i0 R! S/ x
4
. y! b" I! d$ h% @) z# q+ a59 M% M( j7 c* S1 W( J
63 S6 V) C+ g9 `+ c
输出:
" h( \' M* [/ v- E9 T
" S/ u$ G7 p( R+ ~2 {' d3
7 s0 ~* X" I! h# X8 H(60000, 28, 28)
- }6 A$ }9 Z- L( `8 G: Buint8
  M1 G- ?/ b1 x2 c1
% M4 M/ r. t5 w6 K2 l: }2
* ~0 K: B$ R0 W  t; [3* e) t) w; _$ r! `8 ?3 O* ?
所以 train_images 是个8位无符号整数的3阶张量。
/ h; o2 \. e1 [+ @  g1 S* |' _( v6 x
3 S2 I0 l+ `2 ]) Q3 k" p2 ]* [打印个里面的图片看看:
7 v9 v8 K, r, A- {6 h5 x9 ~9 z4 `/ t( b/ C9 y% U
digit = train_images[0]
1 p( W' }' x9 U0 Q6 m
) F/ [9 ?; t9 z# v0 m9 v4 f) |  e- Limport matplotlib.pyplot as plt3 R1 k  v# }: T, M

1 N! B! \3 ?' l  E4 w3 x8 @print("image:")
% Y, I2 s* Q9 I# bplt.imshow(digit, cmap=plt.cm.binary)
1 I6 q% u& Z( M0 j/ F# C5 fplt.show()' j, O( u$ P5 f1 Q2 B& S
print("label: ", train_labels[0])
4 W1 b9 r' G; u" T& Z1% U' i% U7 x$ ?* `( x
26 k2 H$ a2 p+ V' l9 d) Y
3& B9 \+ B. n& `
4* A" H) O, L; I
5
6 }% \  a. s8 f! p* {1 Z8 F6
+ V2 J) Q" A. {7% q0 c# U% M4 ?2 ^! H# y8 a$ a  U2 g
8
8 L1 O; v/ p5 i  h" ?7 q' o1 C输出:
0 s! q" U. E, k1 \  D+ }7 D' {- j- O3 P9 I" A
1.jpg
  {+ W; ^) c. i$ d' B+ _! t8 o+ x1 Q- _; t) F
label:  5& \& {4 e2 k! b+ S  |0 J
1
# D+ G  W5 v) _" G3 w& hNumpy张量操作
" x8 P( v$ ^5 y1 J0 |7 |" B9 p, ~8 M: n  b: i& k
张量切片:' l" r) b$ ]# J) u7 [" j$ L
$ ]5 i, O3 n, l, w6 n5 p6 J+ U4 `; [4 I
my_slice = train_images[10:100]
1 \* Z) t8 w3 w/ w( n" tprint(my_slice.shape)
9 T/ h4 l4 w, D8 g3 \& g7 W16 W) Y3 M( L8 Z2 R/ u) c8 S; ^
21 M. N! _8 H6 D  v9 w
输出:
1 N( h9 t* e3 V' n( y/ x& E 2.jpg
( K! A" x$ \; \/ ~) W) K(90, 28, 28)9 {/ h/ o) X# l8 M, }
1
- ]6 p8 c0 C1 E) ?/ F等价于:* r0 u4 H* G3 O' m* e9 A

& `# Q) f+ X: y; V( H$ a" ~1 {my_slice = train_images[10:100, :, :]
# W6 K! w" M- ]/ I: i' Aprint(my_slice.shape), j) \2 t6 N- c8 L. r
1
% ^+ X6 a4 L. I. D" a8 B9 E& r- R2
; c: ~7 |: ?! ]  q, D输出:
6 r5 Q0 p, d- w, ^$ [) z- Q/ M 3.jpg
* l( M, N7 m3 J) ?(90, 28, 28)5 G% @1 A& Y0 c. \+ Q+ M! G
1
/ V# _; B: @( W+ v% P( E也等价于0 C: w" Z$ R# t; f8 E$ ]8 o2 d

& \9 J0 Q; p0 x/ T! b. J( K1 kmy_slice = train_images[10:100, 0:28, 0:28]6 v8 F& v. m$ J4 L
print(my_slice.shape)
0 q" l/ I& H2 k1
' P! u. _6 T; r' m- z* Y23 }! m4 B, C$ X+ V# e
输出:9 [8 e8 |3 M; T, i7 m
9 I! a6 E4 H* `3 k
(90, 28, 28)
* ]5 W; x/ D2 l9 Z) `" i# e7 ?12 m' B7 h8 {6 A% X. S
选出 右下角 14x14 的:" D) s# l8 r# k7 b# N

+ L% L- K% O& U" b' jmy_slice = train_images[:, 14:, 14:]
" Q- O, V1 i+ x; \  m2 o& U. tplt.imshow(my_slice[0], cmap=plt.cm.binary)6 b9 U/ L. n3 b  E' Q: |" n
plt.show()8 J/ p- @% ^# h. c1 M# F3 k8 P* Z
1) B9 O* R" r$ u9 }4 y
2
9 X% E4 `2 y9 o: w( f8 w; Y) @3
$ \) `8 o: b# `- B: F. F8 b输出:/ v5 I% w* t* D9 L% m

' I/ y; O; b7 t; I: u( ]
# _4 s+ X- }2 z* n; \" Y
2 Z9 F  M0 ~" ]选出 中心处 14x14 的:
2 r0 T/ y+ X3 w( F8 y. |5 K1 I  @. l% M; x
my_slice = train_images[:, 7:-7, 7:-7]! u* w( ]) b* l" z! m4 Q+ H
plt.imshow(my_slice[0], cmap=plt.cm.binary)4 b5 ?* o+ o4 |5 p8 k+ P0 ]4 Q
plt.show()
8 i$ q  }8 a7 q' H" t; s! w4 X1
3 ^' r- ^1 @8 ~. n! q2 q" `2# R6 r+ U& \- i0 k! o# ]8 |7 w
32 v1 r- b2 y! \4 Q
输出:6 j) E$ [! _# {9 Q/ P# Q$ A
, y( l. X7 o0 Y( g4 y& t

$ J7 w7 u- L& K5 O  p' o6 ]% [9 y- C' x9 \. N1 G
数据批量
" E, V. j0 X4 [" i' P/ C. Z$ e6 F0 h% M
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。) k5 y, x+ y2 `: T, V( s9 P
: M0 \( X- r; C8 f9 _0 o
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
1 M5 D# }% V* ?; g, T  i; x( `. p3 y3 e4 c1 a, z" @% H
在 MNIST 中,我们的一个批量是 128 个数据:
: p4 ]+ d4 V) S8 W  l+ ^! t, E
3 e! @& }& K* u5 S# Q* I! e( }) d# 第一批
) I/ C, ~+ I0 t, N. Vbatch = train_images[:128]
7 {9 _2 u, d; ^- }8 ?) l- E) f# 第二批) ~* T2 h7 f+ h6 m
batch = train_images[128:256]
; P1 ~! z3 D) h5 g( k8 P# 第n批
* a" a+ n2 d/ E% h- e; L. Zn = 12* N1 _+ w) x: E1 D
batch = train_images[128 * n : 128 * (n+1)]
7 h- U6 Y9 ]! Z& p; r: U12 j6 }5 ^0 h+ H# s4 ?
2& }2 z2 [6 ?- Y; p7 Z$ N+ Z/ S
3
$ k$ _9 h2 v% N: L46 p* ~; ]5 E1 c+ V; C0 E* L7 }8 }9 @
5# I; K7 c: d+ F) V2 S) [# `3 `2 [
6
- N4 V6 |. u  ]% ?7/ |% Y8 Q1 ~- T5 i
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。' p& q, d  [' M3 d' r* A; Z

. r5 I  `. D7 b6 t3 ~  H( S" X常见数据张量表示
/ p6 t2 p8 [* J- z8 E8 B5 S* L( H5 A2 w# x& I. c
数据
4 h# A5 F3 u0 R
作者: 2863358207    时间: 2020-5-12 12:11
好好好好好好好好好啊发表回复
  G" \% r1 n3 k8 J




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