数学建模社区-数学中国
标题:
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$ x
9 y; W* s0 ]3 C& |' C- W
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
) n/ {$ }( z Z! P& H) }; `
7 g' H2 A( z1 m/ |# r
MNIST 用来训练手写数字识别, 它包含 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 Keras
6 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: T
1
F* d4 K, a: o8 b. g6 |
2
2 t y& Q3 i5 k& g" n1 K
3
! ?# K* K# d; S& x5 D; X5 f a
看一下训练集:
# o8 H+ S1 ^1 l0 u3 x
" ]4 j9 \3 L' L0 q+ G" p
print(train_images.shape)
3 Y9 |5 @- f" X
print(train_labels.shape)
; Q6 e3 o: L( R3 W
train_labels
: }2 a# j8 P" `; C* W8 \
1
, @" v$ x% X+ t; h8 A
2
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& q
1
) C) Y; ]' U5 k3 v' Y1 g' Q, C3 E, ~
2
8 ~3 J4 F o" X
3
# 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! q
print(test_labels.shape)
% X: Q. P3 j3 z4 p, C" J
test_labels
2 D. {$ i: B( h8 d, q
1
- v: |5 H0 |9 y! j5 ] }
2
7 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 C
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
& K; n! R& [4 x/ Y4 P- Y
1
0 ]+ N2 y& q. J$ b$ S
2
Y% o- J# u; a2 _
3
7 w5 j$ X* z o5 k! u2 e9 X
4
6 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, ]# W
from 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 w
1
* o6 ~$ A/ d' t; Y2 Z& z" R9 b- K D
2
, t9 b# T; w1 ?1 `' Z- s
3
) s; i$ `0 _, P6 w
4
% g& L0 G8 q( r
5
/ 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 M
1
2 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' W
MNIST 数据集里的图片是 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 Q
test_images = test_images.astype('float32') / 255
1 g @7 x' z4 ?/ X# e
1
" C7 W; _& p. ` J& f9 a6 q. s
2
$ [$ g+ Y* Q M
3
) l a* h! h7 h1 {/ u- [
4
8 u6 u+ z$ P" x- j( c
5
& 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! F
train_labels = to_categorical(train_labels)
, B& i& }! z# j$ `5 U) k- B! c
test_labels = to_categorical(test_labels)
( S& H# h7 `( T8 [
1
' _( i( ~* }4 @2 X
2
/ S* [: R& M$ E# a; B
3
) N: k( s3 s5 ^
4
% \ ~) p$ r$ |/ Z0 E
训练网络
+ f6 N4 s- L+ w5 I
& M- f* |9 d. ~& r
network.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$ L
Train on 60000 samples
! G1 k' a% W, I: a: J( J- {' B a
Epoch 1/5
5 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/5
1 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.9800
2 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, x
60000/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: O
2
& q' g2 |8 S" m- w
3
9 H x, i& H6 q3 E8 V
4
9 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 X
7
1 i, y, ]) l X6 F; o, `
8
5 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 {
11
9 g9 S: ^% V7 d- ~; F
12
* |# k+ @! R1 _. V# O' m9 F
13
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 U
1
5 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$ B
test_acc: 0.9789
$ h4 c3 K {/ H
1
3 k5 Q; s& h/ q {. s
2
5 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 C
9 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, I
Scalars,标量是 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 i
x = np.array(12)
. ?4 Z& T, A1 R2 h! l+ I
x
3 W+ P. G; c6 v, Q+ C8 ?# T
1
7 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' [- Q
1
2 j3 t% i, A4 W* E W0 h, G' E- ?
x.ndim # 轴数(维数)
: o- W ~/ L ~( s
1
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) U
array([1, 2, 3, 4, 5])
- x: c2 c4 }/ ?& i# j& ^
1
4 A- {% a1 W: u" O) f6 G, B
x.ndim
* _- W7 g% j; Z# i ~
1
0 ^/ ]* ?6 @4 y0 F5 X
输出:
% g) d$ r) F x) d* b
4 Y: h% p4 T2 P4 ^
1
4 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 y
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
% l1 a0 Q' ^5 `
" y# {4 K( r0 i! V( w6 y
x = 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 f
x
! c6 s5 @4 U: H
1
( b$ z' G( p& A+ A. d( m& j: n
2
' q# u- u; N/ b0 V
3
9 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) O
array([[ 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 W
2
. v- {* x8 O, ~% M
3
) Y6 l8 P+ t, i7 V
x.ndim
/ v$ ` i+ [' ?3 r
1
' f2 l5 ` D. Q: y( @* H
输出:
6 {0 @2 S! }/ A' w' C3 c
$ o* E$ [1 I/ @2 r- G$ C7 a
2
+ 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' \- T
x.ndim
' Q/ h" B- m# s9 q
1
$ Z3 B1 [; l" P4 m. s! T
2
8 p, M1 d$ o: l$ ^9 d$ d
3
2 r; g- R; ]4 |( C
4
" E7 ~4 z* K1 t9 m
5
G0 s0 |' B3 Q9 c& q
6
( g- M1 t" }; S# _5 @' n* w; Y
7
, 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) G
10
# G3 d1 ?- Z: W, H' }. P. e
输出:
8 ~0 P1 I" b: v6 ?% @+ n& P# z2 H
0 ?9 G( O3 W* @8 X; E
3
3 N; I3 `' v2 S, R- u
1
6 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 M
5 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 V
print(train_images.shape)
6 U1 J4 Z9 M1 n0 A
print(train_images.dtype)
% V- u* ^1 }" B& H% B% @: K
1
' K/ c5 H2 L) w G, |5 ]: n1 A
2
5 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+ a
5
9 M% M( j7 c* S1 W( J
6
3 S6 V) C+ g9 `+ c
输出:
" h( \' M* [/ v- E9 T
" S/ u$ G7 p( R+ ~2 {' d
3
7 s0 ~* X" I! h# X8 H
(60000, 28, 28)
- }6 A$ }9 Z- L( `8 G: B
uint8
M1 G- ?/ b1 x2 c
1
% 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 x
9 ~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- L
import matplotlib.pyplot as plt
3 R1 k v# }: T, M
1 N! B! \3 ?' l E4 w3 x8 @
print("image:")
% Y, I2 s* Q9 I# b
plt.imshow(digit, cmap=plt.cm.binary)
1 I6 q% u& Z( M0 j/ F# C5 f
plt.show()
' j, O( u$ P5 f1 Q2 B& S
print("label: ", train_labels[0])
4 W1 b9 r' G; u" T& Z
1
% U' i% U7 x$ ?* `( x
2
6 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 F
6
+ 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
2020-5-12 11:55 上传
下载附件
(14.63 KB)
{+ 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& h
Numpy张量操作
" 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" t
print(my_slice.shape)
9 T/ h4 l4 w, D8 g3 \& g7 W
1
6 W) Y3 M( L8 Z2 R/ u) c8 S; ^
2
1 M. N! _8 H6 D v9 w
输出:
1 N( h9 t* e3 V' n( y/ x& E
2020-5-12 11:55 上传
下载附件
(12.59 KB)
( 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' A
print(my_slice.shape)
, j) \2 t6 N- c8 L. r
1
% ^+ X6 a4 L. I. D" a8 B9 E& r- R
2
; c: ~7 |: ?! ] q, D
输出:
6 r5 Q0 p, d- w, ^$ [) z- Q/ M
2020-5-12 11:55 上传
下载附件
(16.13 KB)
* 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 k
my_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 k
1
' P! u. _6 T; r' m- z* Y
2
3 }! 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 ?
1
2 m' B7 h8 {6 A% X. S
选出 右下角 14x14 的:
" D) s# l8 r# k7 b# N
+ L% L- K% O& U" b' j
my_slice = train_images[:, 14:, 14:]
" Q- O, V1 i+ x; \ m2 o& U. t
plt.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 X
1
3 ^' r- ^1 @8 ~. n! q2 q" `
2
# R6 r+ U& \- i0 k! o# ]8 |7 w
3
2 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. V
batch = 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. Z
n = 12
* N1 _+ w) x: E1 D
batch = train_images[128 * n : 128 * (n+1)]
7 h- U6 Y9 ]! Z& p; r: U
1
2 j6 }5 ^0 h+ H# s4 ?
2
& }2 z2 [6 ?- Y; p7 Z$ N+ Z/ S
3
$ k$ _9 h2 v% N: L
4
6 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 E
8 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