- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 570219 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176289
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! g, T) v4 z( Y* _$ @( K( M, _
Python深度学习之初窥神经网络
9 K3 L2 }1 l: H# ?本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。. u8 \2 U8 e" j
4 P4 Y. V( C% ~7 O2 \
本文目录:
Q; X" W+ G! a- z# ^% P4 G. n! b" d
! Z/ f$ j u* ^4 e" S) M" f文章目录
0 r6 ~7 r5 x# [( e: F r6 T3 K6 H+ W+ n
Deep Learning with Python6 K7 m) W$ w/ H( a) w T' G
初窥神经网络/ H# e! l l( k6 z5 S" Z
导入MNIST数据集
# S5 K7 A O7 B! b4 h4 E! {网络构建) }; b) Z3 A6 g( [7 R% ^
编译
8 J; Z; K1 O5 L' _' P Q' U( l$ _( o预处理3 _4 R' ?5 k5 v! a0 b% o
图形处理
6 C5 ^4 U/ _3 l: h1 q" }标签处理
" p h$ G1 p% s4 O0 j- p训练网络
( M; m/ r* ]* H$ C6 u神经网络的数据表示
- U& `. N/ P2 T: @1 D* {6 s! j认识张量
3 g0 l. f! c- h) O4 S; d标量 (0D Tensors)
* I. m, {% o/ F9 K8 t( r# {向量 (1D Tensors)& {( C9 I$ s% f6 I( w
矩阵 (2D Tensors)
. Y: F& p( l$ S高阶张量8 L: B" A r6 {. y
张量的三要素! H& r& A) J( X0 r' j7 R8 u7 V& L
Numpy张量操作
3 \0 N- p! M6 x1 ~张量切片:
4 o5 b0 z# ~! f; e- V$ N Y数据批量$ K% o7 k1 Q& a+ A- P: S; Y! C! G6 m
常见数据张量表示8 A1 @. m/ N0 E
神经网络的“齿轮”: 张量运算
1 {9 c5 Z9 ^6 F$ R/ }: v逐元素操作(Element-wise). Z, r7 y7 C# ?: U" R! o9 i
广播(Broadcasting)
! w' D1 w, j+ b张量点积(dot)2 y, g1 h3 s0 [# [! @" u3 R X
张量变形(reshaping)
+ @% ^8 {7 L" a* P# K神经网络的“引擎”: 基于梯度的优化
$ {/ k8 U* M, h: L导数(derivative)8 ^/ z" N% B G$ L4 k3 }' @7 O
梯度(gradient)
1 L" @+ r" C/ x8 J( w0 D随机梯度下降(Stochastic gradient descent)
- m: |. }5 a# p, w" h5 x4 X反向传播算法:链式求导
# m! f$ F( ~! U8 X本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。; h B8 B% T" a% Q
) b9 X/ h( L" C
初窥神经网络
8 l) t; ^9 v: c* S* S6 x h, N6 p* m) e* z8 v9 i1 ~
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。4 L8 l2 u& ^/ p4 l/ w2 |
( V; q/ F+ ?3 h, F+ T% ?/ M: ^# g
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
9 z1 J' Z* s1 {4 S( h
" y" Q( A3 U! o4 D: A3 n导入MNIST数据集
J0 l# _, E6 s+ t' W+ A# { X+ o# _
# Loading the MNIST dataset in Keras0 [% ^& ?/ ^$ G8 \
from tensorflow.keras.datasets import mnist
0 @- I+ ~8 v0 U(train_images, train_labels), (test_images, test_labels) = mnist.load_data()& ]$ e+ h! h/ Q) V& s" [0 O
1
) ]2 `9 y1 v. O" v# `5 J2# o; X4 ?& C( `5 e
3
- @- G7 T, [+ b" P, D看一下训练集:: \& Q* g! N0 u+ F% P- i( q: F
M7 v7 k/ b4 _$ |- D' J% Tprint(train_images.shape)
1 E4 ] c# q9 e! k* C, |2 K6 ?print(train_labels.shape)
; I) w% W6 K$ B9 {( ?# p# otrain_labels
" P- q; i+ w: C/ H/ q' O1
7 l$ I$ M5 c$ G" t/ P2 j ~2& r8 G* B) k- j1 M: ^7 o4 _! E% {
34 { j5 \% b Q
输出:
, s0 W8 C) {4 c# p7 m
( B" p& N8 o- T, T(60000, 28, 28)) s/ P9 ]$ h3 c; M
(60000,) s' y4 f( a' g( t
3 m8 o1 D- ?. R
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)( [) w/ \. k9 V g! ?) U% w$ I
1: L$ d( r8 ^; C& Z2 x9 ^6 L. r
2
0 m3 A- u6 O* C, W! f/ A3
) L9 V& M. C' d. f9 w/ _) j3 P4& {! {6 ? E) M
这是测试集:
6 l) _* n/ y8 r& ?- P: T
! m5 O8 E7 b( z( D" @print(test_images.shape)9 n) @4 c. |/ b, N( i4 e2 r k
print(test_labels.shape)3 `% c0 z5 D: W* Y$ S& b
test_labels
2 |' i: d, m+ F$ Z& T$ X$ m15 s) {6 H# L6 }& f
25 K% ]* U1 _! F7 c1 a$ q. `! ~
3$ F: p( I; d& [
输出:
" l# `+ {; m6 v. l
: K5 v( p4 D' Y0 c Q(10000, 28, 28)- X6 A) b- ]- M" ]
(10000,)+ w) X. Y' }. t3 L) k$ E0 ~9 ^
; y4 e2 k- [5 ^/ h7 }0 z( i
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)! `* n, V4 ^- ~" u. P7 |8 M; u& m
15 H. W1 g, ^7 L" |% M
2
$ y/ t( m C, M/ K( O5 @# ^% |3
6 J9 O# [+ J2 S- P4/ ^9 P- R& g2 R% U
网络构建0 }1 B' l6 R8 X; K5 \
. d& [9 B) e* T9 t) G+ {我们来构建一个用来学习 MNIST 集的神经网络:
5 ^& c+ w% n) d( a; |6 _; \+ T, F6 G. a2 V6 Y6 n
from tensorflow.keras import models
w' w2 E7 Q# b: Z- o* {, s, Jfrom tensorflow.keras import layers9 O' @* v$ _6 d9 h* z7 Q5 T2 Z" j
7 i1 D- @# \2 V5 o
network = models.Sequential()+ H2 b/ F) S8 w/ P
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
6 j4 y1 x. ~% U {& s- d3 z$ \6 wnetwork.add(layers.Dense(10, activation='softmax'))
; c; O" Y' h4 D/ K5 [9 Z1
% N" T o( |' ~2 t' g3 z; {* H, t25 _# F4 ]5 }2 u2 m% M( U4 r
3* W! d- T* X: u) @# r
4
# S# o& V+ _* j8 n5
D- z. \0 H w- i/ Y1 J6
6 W5 U& x% Q7 N/ ~# m神经网络是一个个「层」组成的。% Y. q4 i' Y9 G5 b) q
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
' _1 J j. Q3 @! F) |6 C' m3 r
5 z! @' f( t* k2 \0 ]- T这样一系列的「层」组合起来,像流水线一样对数据进行处理。
; u k$ \" |; y. F% ?层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。- Y) r: ?& P! {- c4 H& [
4 E" u$ ^( Z, N8 V% ~我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。3 e6 y7 C% w# O' I' Z
6 R8 \: m- j; y0 j2 b数据到了最后一层(第二层),是一个 10路 的 softmax 层。
" @# F2 O5 v3 s4 T& |这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。) g" W+ j0 v$ j0 L1 B
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
. D& `$ P; o5 Y
3 b9 \# ^- Y" j7 r% u* E编译
" k9 [6 j1 x, D7 \' w
7 {9 H* u6 t/ V; H! }) A% \+ C& a接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
6 z+ b4 w- _* n5 X6 E h' h5 T/ m1 v
损失函数:评价你这网络表现的好不好的函数
; B5 P1 j8 a3 B% ]; K6 e) \9 f优化器:怎么更新(优化)你这个网络
& p; a- K, u& M4 I训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度4 j! z9 V% |4 ]# W
network.compile(loss="categorical_crossentropy",
0 Y- l& d; f; j% U/ w7 ? optimizer='rmsprop',
9 M# t5 {! _0 n) ^, t metrics=['accuracy'])1 }3 U/ d) J; L0 V7 `! l
1
' |1 S' F1 W& H' g4 K: ]4 e2) p, E1 ?0 d* r+ W Z; b
3% O( I$ W9 S0 R. j3 Q+ ^
预处理6 l+ F9 @% S1 _/ ^5 N% G
# G- W; p9 m( ]! j
图形处理2 T S3 j7 C( W* j% T
( J1 F0 C* u1 b6 l我们还需要处理一下图形数据,把它变成我们的网络认识的样子。/ P) z0 T; G3 {9 M
# q9 o5 u; Y3 C- d# |MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
# T' L! n6 m0 N7 g而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
- K& c( o u: R
$ I& I4 k2 y8 A0 a+ x0 e! \train_images = train_images.reshape((60000, 28 * 28))3 h/ p2 H8 d( s& L, M' ^' M
train_images = train_images.astype('float32') / 255
+ C; n& m O8 P* R$ ^. Z! g
% y8 G# y* O, wtest_images = test_images.reshape((10000, 28 * 28)): y* g; W( d9 z0 H
test_images = test_images.astype('float32') / 255
( q7 G4 D- J2 F' I X1: H/ d7 V3 n$ ~4 T! c5 U, O8 x
2& @4 ~% L9 S- ]6 ?5 _. q/ V
3
. [: v$ N# Z" d0 x3 |! O2 F$ W* H) y4
* R* Z( l7 Q! W5
+ L) J5 S3 Q& ]* q$ r标签处理8 o2 Y9 {8 T/ Q$ X6 D
6 v' H) b- ^- m& ^: C; n3 Q$ }
同样,标签也是需要处理一下的。3 d( \" E+ K0 [, o) R
1 l- h- r) j7 Dfrom tensorflow.keras.utils import to_categorical
! t* q: W8 q/ L! O, |
8 h- U# \, j# }$ e; j; ltrain_labels = to_categorical(train_labels)2 T3 L7 W, u0 j2 t0 C
test_labels = to_categorical(test_labels)
' U G* T0 C" X* |4 v% h$ N- l1' X* M) j! t. ?/ t' i! |
26 \2 {: G- t3 N% ~6 O* V* Z3 g9 [
3
2 H- x6 S7 v- k: A) R5 F47 U$ b% {! o$ z/ w
训练网络
! }+ e1 k2 i7 ^9 ~* s
O, T8 X3 i: S1 C1 K8 V3 Vnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)- Q8 f4 C s8 ^$ U
11 G% x8 o+ P% H4 r
输出:4 H4 W* E( i0 O# r5 c: ]
3 H0 w7 l- V9 M' Z; aTrain on 60000 samples
6 y6 ]1 I; q* m. Y5 I% V# qEpoch 1/5" X) E6 q' H* E* W, W
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
`8 ~2 Q. {# |+ D* l& i3 v4 zEpoch 2/5: h ~7 }. V+ `. i9 r
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
' Z* t* \ S# d) w- w/ }Epoch 3/5
N# O& x- g; z7 Z9 y( d$ @' ]60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
: X, Y( f4 x. v5 CEpoch 4/5
. k5 v8 a1 Q3 O& q60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848. X8 G. z1 ?& O2 D3 |
Epoch 5/5
; l. A: N! _2 ^0 b7 ~60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888, \) x+ |2 W& L7 G0 }
. e: i2 `7 M: y<tensorflow.python.keras.callbacks.History at 0x13a7892d0>! z& n& m3 x* J2 u
16 W! w. y% e8 |' s# k/ e: Z
20 E7 r' V3 n0 s% s' f
34 Y$ q6 h1 y# w8 {2 t/ N$ Q
4- X R2 H# d9 U' g/ T
5
) t C" W' J( Z5 R0 t! W- z5 J7 I6& J* K& \9 e- |3 S( @8 }' S* ?" j
79 [( ?+ Y! L( H' i/ [
8
6 ^+ H& Y7 ^8 B! d. h9
- u% k5 S y2 [. Y6 b10 r+ z" ^9 J! v
11
$ O# T& ^) T+ T4 f) @1 B) l" i12
* ]+ ]1 w' f& T% |13! |* o& t I" y F/ |6 n6 H
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。 _, M, w/ M; M2 y) \% h, @9 P# V
# v% u5 `$ m, t5 ~8 W
再用测试集去试试:2 B+ B' X$ g- T; v& I4 g1 U0 N
( ?+ }0 w$ N2 g% G2 i o
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/322862 ]* Q& G$ z5 i2 m$ ]
print('test_acc:', test_acc). @ K* P+ k/ \% Z
1
: j; t6 p6 l+ [- k# U2
$ _" R$ [7 _. j% P/ T% D输出:8 C! G7 ^2 S* G0 t& C& k- Z: q
I' H7 a& |$ F/ a. J
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789( m9 [. J4 j# I( i- T' r
test_acc: 0.9789
( _9 u& Z% Q l3 \1
8 H* {1 I6 O1 Y1 B2* Q$ Z# E% e5 d2 v! i
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
( u; E+ c: u& U* \/ M, M
) U. K }, a$ ?9 O! E神经网络的数据表示
! ?0 z$ m" s& K N( c; ]* t% V0 e. M1 I$ t
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
$ |3 F, D1 q7 Q9 t; K! Y
+ a0 l$ m8 l0 j' S7 f& |( l! z我们常把「张量的维度」说成「轴」。
! s7 s+ `( Y( i5 A# l* V% v9 l
) D9 O+ M( B# N& l6 I3 J认识张量
8 ?& B2 H2 \, h, z& A0 Z, U8 k" R% Z. ]
标量 (0D Tensors)
7 B0 `, V( Q+ s# C
4 s, R/ z ^3 D0 F4 QScalars,标量是 0 维的张量(0个轴),包含一个数。$ S1 O4 h) j: L" a# c: R
+ k0 s; y- V4 M& N
标量在 numpy 中可以用 float32 或 float64 表示。
8 R2 q8 w% w! B/ l) A4 i9 R. \* S7 M8 }& W* {3 l4 ]
import numpy as np
: A5 P/ J/ E0 {
* q }; B) Z0 G4 ^: W3 x7 Mx = np.array(12)
0 B2 r5 a0 `% y6 Yx- s; a% d2 f. }" t9 {4 \0 r1 {( P; G
1
+ l! }5 _% t! q/ b20 I. l5 }. e! J; h
3
8 `% ?! R0 O+ n6 ~4* c1 H' _8 [! G5 f
输出:
: M. m3 X8 {+ h5 i( S" I% t' k0 e
array(12)
1 X/ D% ?& U" w. K3 P9 h1 E/ d6 |% t" }% X0 ~0 _# U
x.ndim # 轴数(维数)
0 w$ Z* E- R3 A) \- o1# S" ?, ^+ X, V5 q
输出:
6 z1 f) g; m& E$ H# o
. t! D# c# r$ N- l0 d1
' }3 T, f5 h$ w$ n: _1- N9 c( Z m2 B! a6 |. B# a
向量 (1D Tensors)' H: t# ~( l/ Y& H2 o2 ~) i
I; I, N% D- t8 e, N; }Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。' A# u0 r8 k i+ n4 H- j9 p. ^
7 U: V1 r2 x$ x! E) x+ j; e! H
x = np.array([1, 2, 3, 4, 5])
6 Q# X* ~0 n: W1 Ix/ e. g( e, V4 H& z" s) H
1
7 n% B& Q! ~; ^" j2 |' B# s. B% A2 D9 ^- g. U
输出:+ h/ t! H& H" y; ?& F2 u- e. f
: v; G. b! d1 b2 A- D( x' C5 c* Q4 Rarray([1, 2, 3, 4, 5])
* I3 R; X- E5 |) X9 ?! Y" P! N18 i- B8 r% S; y. q* B* x: |" T4 d
x.ndim
# P" L. i: t: Z0 o1
. y1 F6 v. k5 ? n输出:0 a" t' U0 ^0 H; g b
2 g' M/ e( _. K
1
5 j2 C/ r1 R1 O1
2 B1 h) o3 n/ K, K我们把这样有5个元素的向量叫做“5维向量”。+ R$ {- @( g- z2 A8 t/ O
但注意5D向量可不是5D张量!$ @5 r& b/ f/ L. _0 v& ?+ j
( ?; y- G- n" k3 s8 Y- _% |
5D向量:只有1个轴,在这个轴上有5个维度。
8 w- e- i6 ]0 f) T \: a: g5D张量:有5个轴,在每个轴上可以有任意维度。
* d7 O/ y$ a% y/ L这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。7 C+ ?% u+ ` X: N
8 E4 i. u1 c% R2 Y
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
$ u/ O: f$ n$ P2 S, {' S
9 p( u- o3 |) J6 R$ j8 R9 x2 B矩阵 (2D Tensors)$ h/ P3 n& {2 ?/ l( g; E
$ u: y8 B% Z0 uMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。0 ]5 s- i' O' w `+ v9 X
/ ^8 C3 F: l" ^x = np.array([[5, 78, 2, 34, 0],$ q: n6 o0 d: d% x F: u
[6, 79, 3, 35, 1],
+ R& w C# {3 S) y! Z8 J) c [7, 80, 4, 36, 2]])0 J1 {/ Q3 q( K+ t
x+ W- x! S+ Q' T- p
1. s! \6 Y3 ?/ b4 O, R
2
5 [( ~0 N: ^# s1 G; w$ r3" ^' h3 R* d1 j5 X; B2 M0 l, k: x
4 G. B$ y9 A: V( n- J: n
输出:* s! M+ A! s* {: r& e$ ~' n
7 k0 q ?! g; r. {" e/ i, t
array([[ 5, 78, 2, 34, 0],7 P: X. E( i u C% M' f
[ 6, 79, 3, 35, 1],
T" f; `5 ?2 F! p( a [ 7, 80, 4, 36, 2]])& c2 q. K6 _' V9 r, j
1
% M1 R9 F! P8 ~8 p2% W, T) w& ~5 k; y8 `
32 P. P9 {) `0 L) V
x.ndim
+ O- I: O9 f5 R1/ k/ F+ j+ F3 P) N- C! F) Q& j
输出:3 j5 F/ m# u0 W
2 v! N4 w6 ~- z+ C
2
0 [6 q* k; e- \3 t% m# j+ {* n1
9 W7 C7 |. i8 I4 a- b3 Y- h高阶张量* H/ ~. V$ ~) V$ v
0 [2 O& j: S$ W* V8 B8 s Y$ J* |你搞个装矩阵的 array 就得到了3阶张量。
h3 l9 j6 r Q, ~2 Z- s7 f" b
! l. R3 J* ~1 z1 W. Y7 g( L, p再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。/ I& a2 s% M0 i7 z- u
) s0 g6 i8 h/ S) Q
x = np.array([[[5, 78, 2, 34, 0],: N- C M4 `% Z3 ~" f. H! O w
[6, 79, 3, 35, 1],
$ `, K/ y& ^+ _! r [7, 80, 4, 36, 2]],0 ?+ }) U5 u! e% q- M: J6 B# t- x
[[5, 78, 2, 34, 0],
( j, L# s' N1 l [6, 79, 3, 35, 1],
, j/ q6 p+ A& l4 l [7, 80, 4, 36, 2]],5 y$ ^7 E: B+ F( r2 l; F( S
[[5, 78, 2, 34, 0], f, U) X: \2 G A
[6, 79, 3, 35, 1],
" i6 r- s: {0 J5 N! ~& p [7, 80, 4, 36, 2]]])
9 K% i" S5 k3 o% H8 s; X$ Xx.ndim0 a' J0 S' z9 Z
1
( X+ ^1 w6 D% C) q2- `7 B0 a: w- _" [; e
3
$ U3 _2 v% p" P3 J u! y) x4# q" {$ R3 B( `8 Z* y
5# Y7 c1 i( C5 E% Z3 t( A/ v; _$ _
6
; F; ~) D7 O) q. a: W: n. V* Q( s74 g- w9 A. P- A: M) u+ e
8& ^( m3 q4 Z3 ^6 \4 G
99 n# o; @, s# R9 j; o: |( f( ~
10
. r" @- L9 ?/ @& o0 r$ i+ S输出:7 _# ^- ~! Q" b9 T6 d1 p/ U! B
) q* L; S$ E- N; D- Q( I
3
4 d/ u+ Q' N, F6 w14 S% t- ?/ b: k; y
深度学习里,我们一般就用0~4阶的张量。# V1 T$ l M( m8 ^1 H
' B" W" i+ W; A9 _
张量的三要素& x; Y/ ]6 t+ W
F9 o# {( t: _/ O, r* B6 }阶数(轴的个数):3,5,…
/ A) _1 N5 S4 K# ~# i形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
4 j3 N4 K3 c+ q9 V数据类型:float32,uint8,…
/ P7 r/ k$ |! g* N* y ?/ C* o4 M我们来看看 MNIST 里的张量数据:5 a7 s3 c) w) ], ^6 Y. l( m0 W
9 E) f- r/ T) \8 D2 d
from tensorflow.keras.datasets import mnist
0 }! G1 g: Y8 U4 N% P& x5 Y(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
6 o' F% W: F& {% j, p* `, E6 j- V
. F' H3 B) {& y# B. H2 _: l" r2 i/ bprint(train_images.ndim)
3 F3 r# R# \ ] j" C; vprint(train_images.shape)
: ~5 B* V/ z4 }" \" C( @0 Sprint(train_images.dtype)3 [# P' r9 S1 I$ ~% w3 f2 A( `
1* Z) ^# X9 R' Y6 w
2& E0 E9 z& Q# p; ~( V0 z
3
& `1 ?/ T. J/ X1 f) y4
: Y/ }1 h, A1 R- L- i, v2 z5% i% O( y* {: O8 x; r
60 I, o7 M% N7 O" v/ W0 P
输出:5 D4 W' C) `5 A
5 r: E. a6 r' c3 x2 i3, d% R9 T m8 j( p) T" y/ S
(60000, 28, 28)
( J$ N5 n! q K8 Zuint8
) r& U4 f0 ?! W/ N- [% Y1
8 L! P( O, X; X9 F/ p/ ]2
% j0 c2 N! l; ]+ [( V36 J j- `4 ?# U( s1 @. l/ M
所以 train_images 是个8位无符号整数的3阶张量。
" q! P1 V% V" [6 _& p9 B
6 A6 w& n/ L8 y6 t" R打印个里面的图片看看:
2 u i& U; l7 p) R- P- j
7 b$ a. M, l7 o( V- s) Idigit = train_images[0]
$ X+ H* h/ n+ Q5 r0 o, p8 c. Z0 |0 @! h" e, r2 a6 q+ f
import matplotlib.pyplot as plt) Z" n/ R" r- i9 E- ^
& b; V" [% ^) j6 Fprint("image:")
' L6 P7 W' e/ t' Zplt.imshow(digit, cmap=plt.cm.binary)
' |, c3 z# N0 X" nplt.show()
' ^; o& V" }$ M! e1 w# Wprint("label: ", train_labels[0])
8 R, M0 c6 F% L0 r3 K8 H( ~0 u11 v4 {+ y! O+ T5 x
22 x6 C) z; U# _" m5 ^* b. S
30 e x; ~3 J( ~; v# n
4
$ F/ A! J! ~/ W2 F' T& K# R( ^5/ l. X4 N- ?1 j, K( a
67 O" e8 ^: x- B9 n+ h7 C- a
76 f! B0 x- _3 d
84 p& i, H* ]( l: c
输出:( k; g, F* _+ h2 U/ {% Q
; A: L$ g. I# J' s: \
$ T6 w- X7 {5 U7 t( j: \
1 }# g7 v- ]# k' k; W8 llabel: 5
/ l! `& I1 N, I) z8 s1
' M; _$ P3 J" D" _: \Numpy张量操作
: w9 W- R+ \. w. u- w& t7 Q
3 R- X2 J1 Z2 W# N$ _$ h/ u张量切片:
; o$ O9 o+ ? G/ [0 _( o c" `% q' }( f
my_slice = train_images[10:100]* t7 r8 j& G/ H
print(my_slice.shape)
8 `+ q/ H% K$ Y6 E. {1
`% N8 y- w% T25 I& g: i& {" j# A$ }
输出:, q( Y" B# U6 c7 q" H8 |! d6 U
- @$ i5 d7 q4 G(90, 28, 28)& O0 ~; ?& y/ f4 z
1" s7 A% C" v8 g. P1 F! G; e1 g ^' b
等价于:
, S! K Z2 o5 ^, I% W: `7 `) J
: M7 _+ v) H, V+ k: mmy_slice = train_images[10:100, :, :]
2 j T6 `) i2 R- uprint(my_slice.shape)
9 T! I" e3 ~2 D1. X1 U! l' P% a8 F, k$ y
2
3 R1 ?2 f1 w' M输出:: @( W0 E4 {" }0 _, R2 o
0 B8 u. _: L' l/ E
(90, 28, 28) n d4 v8 r, u6 |
15 r: _) i0 q/ P7 Q
也等价于
@ s5 T# Y1 g' [/ k
5 }/ Y2 J) {/ b+ |7 W" r# emy_slice = train_images[10:100, 0:28, 0:28]
* e1 g" `8 [* k3 gprint(my_slice.shape)
8 |% p9 y# {# P7 A" d, n, z1+ H4 k5 P, I1 v# i- Z3 J9 d$ a' D
2
/ b V8 H& o; G% G m+ s% E输出:
/ ]# ~( O/ ]! }- T: O' g8 U2 }4 f/ f. P1 s$ x0 {. S
(90, 28, 28)* ^, G% K9 j# |3 p4 T2 x' b
1! I, p# h: A. X3 v) i- _
选出 右下角 14x14 的:
* s! t0 j# k; q9 d- g$ T* m) Q& ~; G4 }
my_slice = train_images[:, 14:, 14:]
2 v# R. o& S" w6 @: k. Z- I: iplt.imshow(my_slice[0], cmap=plt.cm.binary)
: I- z! U, z4 J/ Rplt.show()
" L6 [# @% p: h12 ]2 i. k0 Z9 K& E! \/ Q5 P, q! i
2
9 i# g1 _! W! o/ u% n- \3 m9 L) F3
$ u+ g, m3 _# v4 ^- e输出:9 O! U9 `' |2 X9 m9 H
4 h, v% @- v! s9 ~
3 l5 i3 h# f2 O3 O, W6 F
, a: v7 _2 K* E X$ a选出 中心处 14x14 的:( }! g2 E! _* K* L- j; k% t
4 u; y h) v# o2 h! O* N
my_slice = train_images[:, 7:-7, 7:-7]( Q8 u2 l1 I" c {
plt.imshow(my_slice[0], cmap=plt.cm.binary)
8 v: h _! g' }7 o; cplt.show()
, c3 @- B/ ^1 ^2 w$ [. X; q3 m1
5 A x! n: |5 m& Z/ A2+ l. D$ f& h- D4 Y1 \
30 U& m. F3 y" z8 X( E' l
输出:
- j; I# K+ F I; z( z/ \. Q! M2 f1 n9 X" D4 c1 y, s v
9 K7 x# f6 d4 M; B
5 w# J) w6 Y: @) \6 P2 g数据批量
4 D, }) e3 J% O
- i; D+ J/ G1 H( w3 B0 F深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
( Z% R" y. e3 o
$ Y( w( k% Z# S* t4 O0 C深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
+ d2 ]. a: ^* T( M% u0 B, G7 G5 L" Y) |
在 MNIST 中,我们的一个批量是 128 个数据:! J$ X. c: M8 ?' G
. @# M& f# r4 S) ~4 m6 L
# 第一批
" O7 G+ _, n3 G. O( D7 o* V/ c tbatch = train_images[:128]3 L t$ C: o9 P) ~
# 第二批* m6 k9 @% _3 }% W4 u: `3 Z/ S D
batch = train_images[128:256]
+ ]7 i6 n2 B- d2 X4 v( f, D# 第n批
* V: M5 D% r+ H1 a, @- An = 12/ }% v1 y: s7 I: p9 ?- m6 Z+ t. M
batch = train_images[128 * n : 128 * (n+1)]
! l4 K3 M$ g ~% W; C% g1
4 E" F& u' O( D. C7 i2+ Q8 K: @/ `$ n% w5 C. B+ X
3
( z1 o, g6 l$ W6 c6 k. T- _4% y" r) W+ h5 Q* z; G* H: B1 p3 _
57 A0 z- @: s0 v& d1 i) h
6! ~" g# W. R- x1 j9 s
7# Q5 C1 w: Y* {$ u% I* D
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
6 j: |' K# q* c+ Z
2 }, V& R* C1 v4 r: n常见数据张量表示+ i; H0 W8 b) K8 t( c# H$ [* l
& Z+ t$ N& y% P) x
数据
" G/ x ?! a$ r6 v9 Y9 k1 \/ B |
zan
|