- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563368 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174233
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
+ Y% E. Q1 I* m# XPython深度学习之初窥神经网络
5 T/ C! s+ Y3 O, F本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
( N- E5 p- k/ ?; z1 x7 ^% o& ?9 ]& H0 y5 \% U2 D" \# v' R
本文目录:
8 x k4 M- z4 `; g4 ~; ^6 n7 z. X" h1 b9 v
文章目录
) x6 i6 i0 J6 \# S5 e' Q
# Y9 I7 J, a) P/ h& X5 {" _4 {6 ^Deep Learning with Python* T" ~" m B0 R" j! q o
初窥神经网络0 e R9 X; R% s, E' X, a
导入MNIST数据集
4 m% ]( k( w6 S) b网络构建; _& d8 t# u: y
编译
: c+ q) k% t: ]: t2 ^预处理- y9 {3 G4 {- j7 v' w* t3 d+ ?
图形处理: g# O- p4 E# Z0 {
标签处理' E& @0 t+ Y! M& Z- X) Q
训练网络
0 ~ C( Z# p4 D. T& U* K& K神经网络的数据表示
. m n( \$ f! f认识张量& w' W$ R$ ?: O8 t
标量 (0D Tensors)
* q; W. k" Z( W; F- G9 t' E向量 (1D Tensors)
, O; a8 K, O6 H& W1 u4 `" Z( C矩阵 (2D Tensors)
$ N+ ^7 m$ N1 M1 I# y4 V- g高阶张量; y7 e4 D( A- q. r3 A
张量的三要素
( z& ~7 `, o3 u4 tNumpy张量操作2 f4 e7 B+ E+ F* L4 ~ W* U
张量切片:5 t1 f2 k4 W" Q
数据批量9 V# g z* K% q) k
常见数据张量表示
& T( x5 F& E) n# n3 Q0 s$ }, [2 H神经网络的“齿轮”: 张量运算% n" j; @/ o5 [
逐元素操作(Element-wise)
5 x u; |1 N! a( G8 O3 u1 b广播(Broadcasting), o" _5 G% [ u
张量点积(dot)
! l9 E5 _' \" o$ Y- ?$ }; [张量变形(reshaping)
% n: L* i% I; H9 j) L7 C神经网络的“引擎”: 基于梯度的优化
9 ^% x) _- ~+ n$ T& z导数(derivative)
+ Z4 F$ w, r3 b/ O- d1 G8 t梯度(gradient)( ^, o& ^4 }; B3 F/ Y- w9 z
随机梯度下降(Stochastic gradient descent)6 O1 {2 X6 P0 z
反向传播算法:链式求导2 c; u! W& O7 J2 s6 ?* M
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。1 s- v" d4 F% I+ \. H
0 z5 r3 ]: C7 s4 d. Z' q初窥神经网络
# ~) r/ m. o( I" }; m$ g( T3 ^, s- {
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。9 F% P! R- J9 v: ]/ w$ y% ^2 q5 L, M; m
: h! j& G, K0 t! O# H9 K9 Z0 ]. ^
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。- a& g0 j7 ~& J! s5 G
D* ~2 G$ r" Q9 Z2 _导入MNIST数据集" O; g+ C. u8 P% a' g. @( E& N `
( z6 I' L; q+ N3 P o# Loading the MNIST dataset in Keras
R( a; Y9 k" ]" mfrom tensorflow.keras.datasets import mnist
- F7 q) O, C% j0 c; o" X(train_images, train_labels), (test_images, test_labels) = mnist.load_data()5 n) H; |6 Q& P* Q$ C% }
1
9 \2 G+ ^. ^7 b3 x3 S9 Q; H, V2
8 |/ ~9 B8 U. f. v+ _/ y! V3& D% S9 D& v0 r2 F- ?
看一下训练集:! ~4 Q. j' R s! d( B# {
" P% q- f6 q# a7 W$ bprint(train_images.shape)
) Y) W3 g5 G% S$ q. D8 Fprint(train_labels.shape)
8 T# j- N- S) _+ U% ?train_labels5 |8 k+ I: O) _. K. e+ f
1
, x# L6 A5 z) M2
7 y1 A3 o U, h; u( u( L* P a- j3( @' e& V3 V0 @1 m5 D" d4 ^; z
输出:7 x1 K% T; h" A, _( {" i
; X2 }' X w1 ^% h# v o(60000, 28, 28)
, n5 v8 M1 [2 n5 W(60000,)* y& B; E# @8 i4 O C
6 n P3 c, ^6 N- u. iarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
- p$ \5 _& c" ?. P& N+ J+ C1
7 u' z7 k/ m( @* Q22 M% a7 z y9 T% Q1 a
3" F7 ?7 ~) U4 ~+ I3 f. F! g
4
* a$ z* ~' [% m) Z) u4 X' x这是测试集: T$ `: h1 `, o9 q( x0 w
* R L% G3 Y& \print(test_images.shape)
; M/ ]# T3 c: D) Y6 W1 H- Cprint(test_labels.shape)& P1 |2 D6 g4 b' M
test_labels
- I Z0 o) I0 D1
& N J; v$ G2 f2 F& n2 S6 h; j9 i
3) E1 l; D7 V7 ]/ y: k
输出:3 n- F/ q5 |, _' x% p
! ?5 U* } e) B1 k1 F(10000, 28, 28)
) G& Z4 I! j' \& l( B(10000,)9 E- ~2 o/ m* v4 [
. \) G8 V; r7 S1 z a
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
4 C; g' q3 v, G9 Y19 ?; j6 N8 R) K# V
2
; q3 v+ \& I( [. G3
; J1 L8 w9 H& [( d( N& J4
$ R: U, Z6 ^4 a; l/ K X网络构建
7 Z0 i& q9 }- Z, x2 J# G
. ?* Q* V( i* J* p) }我们来构建一个用来学习 MNIST 集的神经网络:; P! H3 j- R, ^; z' p
" g/ d% u! L3 ~from tensorflow.keras import models, a" D6 t# x/ i& y' b
from tensorflow.keras import layers
3 J% Y, c& D) [
- J8 D g! Z1 d/ anetwork = models.Sequential()
+ p$ X8 H! c: m0 t" qnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
, u) T! \, D0 U8 {9 U- A9 a, Gnetwork.add(layers.Dense(10, activation='softmax'))+ G7 J& n7 U+ C" F) F
1
# ~0 l+ e9 M. L! j6 A8 T; h8 b5 W2( Q) I0 @9 @0 u( I# _3 L
32 v% G2 i" i! g/ ]+ I: X5 g0 c- M2 t
4. [' G1 R+ R. h3 O A: ]0 `/ S
5
% a) B2 U/ M/ H4 R r2 M' s6
. A3 g ^$ b: w# p G Q神经网络是一个个「层」组成的。" E K) M9 V0 ?
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。7 ~% }9 s0 c) E, j
$ G4 A! l+ t) C V! G! y这样一系列的「层」组合起来,像流水线一样对数据进行处理。( q0 G+ i2 a P0 d
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。# w1 y, s* B" y, c
5 t, n+ x2 n. s( P F) H
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。 }& t. P, X% B
2 d ~! ~2 Z* G2 I' R6 h4 Z
数据到了最后一层(第二层),是一个 10路 的 softmax 层。
# _5 |$ N( A- q6 P1 [这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
6 Y# n! Z3 u3 t2 U( S事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!# s! c1 R5 a a3 r" Z B
9 T+ P7 w' K( G; H编译
+ s) v" m' o* w" ~& @4 r; J, K* _5 t2 T
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:' K1 ~- A8 t$ j7 p6 w
% B- j& r4 \8 _2 ~1 v! |( k8 C
损失函数:评价你这网络表现的好不好的函数: M) U: s, B p6 ~+ g
优化器:怎么更新(优化)你这个网络" `* \' \3 {; ?/ f# S" y2 n# y% t8 T
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
: ?5 h/ L9 B$ pnetwork.compile(loss="categorical_crossentropy",- V4 M: W, d. A* Q! K2 G- q
optimizer='rmsprop',- h6 p: B( Q7 v
metrics=['accuracy'])
& s+ A7 \2 B; l3 [) G+ F15 m0 b8 S; m, K2 G) T( A. `
2
6 Q1 `8 L4 W7 w3& ]" q/ R. H0 J0 |" _" ~
预处理; b/ a/ Q) f" ^4 r# U) Y5 T( u
( {& W/ g: ?% `$ M. t; X图形处理, I$ R& d0 r/ o" l# q, \9 W3 z
1 E) H: J1 p! _# ~! }4 T5 [
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。) R" K& B7 d: \+ a5 u. j. e
+ |5 C; T# Z4 H' B3 n1 y* M2 c$ JMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
7 _1 `- q& V0 l# w1 O而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。8 \& i; [# `0 F( q7 Y) M$ E
) O% H+ C: n4 Y2 ]train_images = train_images.reshape((60000, 28 * 28))
0 l2 q8 P/ V5 Xtrain_images = train_images.astype('float32') / 255
8 N N( Q& X/ D/ w) g6 v, g8 e% _5 }9 D8 o/ B1 g
test_images = test_images.reshape((10000, 28 * 28))6 _+ \: l/ ~/ {* b$ E: y
test_images = test_images.astype('float32') / 255
- z# t, s3 i$ c' n9 H+ u8 r1
6 }3 F! K: o3 I- P& p ^/ @2
; K5 t! e0 i/ q* P2 B3
8 y' P z% w- K0 i4
- G; W1 C Q8 s+ H. F1 |0 H53 n" v6 T {. i
标签处理7 u% f0 t7 l% F; K
) b% S! S) f; g1 N$ G7 k; ~6 E同样,标签也是需要处理一下的。8 q/ }) Z0 f: K4 u; _# ]8 V4 l# a
& f: c- @4 k6 I$ C6 j" j3 ~from tensorflow.keras.utils import to_categorical
# Q7 t; O* m2 F h! {. V7 d% n- c* G! z$ T( m- u; T1 P8 v. G; l
train_labels = to_categorical(train_labels)8 G) u2 |; x* J
test_labels = to_categorical(test_labels). b, F8 e2 x( a" W
14 v* r6 `9 o1 c
2
8 P: c- T7 X, j1 L3 m% a3; k9 m, r: S ~ c# @, K
4
3 { \8 n v" j$ d+ c- A5 y训练网络: |$ K) g0 e( J( ?4 `) d4 ^7 k6 K
- i5 X3 r8 r0 {) e3 y
network.fit(train_images, train_labels, epochs=5, batch_size=128)7 x( g6 I) m& `- k3 v
1/ g1 K$ w. B" p8 L7 A5 t4 [, m1 D% m
输出:- O% _" @$ I3 n3 x2 h9 M# l, m& u' U
5 l& p) S. _, Y4 r9 `' E% {Train on 60000 samples, L. K6 Z9 g6 w" F9 H. ?
Epoch 1/51 z+ N6 c/ L1 Q5 `
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
# l; c$ {2 y- W+ mEpoch 2/5
& `8 S# c' a# ]4 u m( R60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.96933 {* a- C8 p" B1 C' M* W
Epoch 3/5; x/ E0 D$ @, _
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
; W8 g( b9 J& h$ f) W8 u( \Epoch 4/5 W' I; L* z" Q" L2 V
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
& j. n4 N' ]4 [; Y0 g- Z2 YEpoch 5/5* F( u' X0 G2 k
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98881 `/ [2 y# k& M1 S/ f
& a- w; G G0 u& O! [1 ?: b6 b<tensorflow.python.keras.callbacks.History at 0x13a7892d0>& x8 N6 V( L- {4 S$ N: ^) o7 z: ~
1& r# v- I+ e4 V( v0 \ E- _- x
2) E' g6 r5 A* ]1 n0 Q: m
30 i! j3 X- ^5 j
4& \) r- q m9 W3 ]
5. G# p1 {& I5 b& ?
6
4 b! @: N0 u9 H) ]$ A74 Z5 {+ g6 a# a9 f" a/ c1 F+ ]2 m0 f
8
2 a# j- c/ H0 C& O* C9! {6 t' p9 X7 w; ~( w+ F/ [
10+ \2 L' ?$ i; q8 ~
110 Y* ^5 S9 M0 [4 ~! D9 U( f7 v
12! B6 S) }' Y4 [9 n) k
13
/ Y% X. J3 S, i0 j. D- f" I可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
+ W. e G) R. @* }4 O
3 c9 j. v$ B N% p再用测试集去试试:
; s* N& J9 _( e; G. B8 J; q, B s+ ?- n- v
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! y6 g$ F3 |9 {8 Z0 ?& F+ i# }
print('test_acc:', test_acc), f4 m6 X9 C, l9 T9 ]
1
# e0 Y4 K* x h% a! L! N# v: ~21 C; c1 E! \' t. S/ J3 A Q
输出:
4 V5 d! h8 H1 T' ~) Q
# D* w2 j/ Z" q P3 s" C10000/1 - 0s - loss: 0.0362 - accuracy: 0.97899 I* P5 v5 p# l' f- }1 R4 L
test_acc: 0.9789
$ L$ E$ t! p6 ^+ ]1: i8 C; P2 Z/ N+ _
2" s8 y$ c9 V0 _) X
我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。, F# D. K# G) j0 Z6 y5 ]( w
5 R! \, B/ Z+ s* k$ B神经网络的数据表示
1 H$ X/ A, ]: y8 |1 Z, t+ J
+ B$ ] |' \" v( h* A- l- iTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。' `# J& h+ H9 B4 U$ E
( X7 _/ H u- L4 \4 b7 H我们常把「张量的维度」说成「轴」。# H% _- `/ \: K& l2 l6 c' R. V" y
6 ]7 W7 @8 k/ K( F) f) `" F2 z
认识张量" y* r1 {' m. T& x. G& H
0 A' O, N& S+ M" e
标量 (0D Tensors); o# c- N( Z8 ?0 b
7 j3 L* h; P7 ]: ]9 PScalars,标量是 0 维的张量(0个轴),包含一个数。
C0 [! j T7 V$ b5 D5 W1 T! \- m
标量在 numpy 中可以用 float32 或 float64 表示。. E0 G1 G( M4 e+ n+ D7 p
7 U. {4 h6 y7 X6 \# o& v7 [
import numpy as np
8 n1 l! B- L8 y3 v3 [' A* d3 `1 S! K8 d; Y
x = np.array(12)5 Q. d+ Y8 M' {. W# u
x& T6 C$ g e# v; o% Y
14 u, Z7 Z* P( l# T7 w/ V8 K
2, m: M/ v2 V" s3 F7 k" M
3
$ i8 G% q* g( M4 _# d4
: C# l; N; Z5 E) C0 v9 [输出:
" {& @8 O, N' [0 v7 P
/ s3 G0 i6 S5 E) x% g5 [8 aarray(12)
; F7 R7 n. B2 u1 s1/ w' G7 _0 _+ V
x.ndim # 轴数(维数)) t. _! }% R) K- b
19 Q/ s% Y% Q. ]" _4 D$ ^
输出:# g: S# p2 M, M
7 {/ G6 G1 M$ y1' z' G. \, d/ Q5 s" W2 T
1
: l$ @! }, ~6 j A* T1 k向量 (1D Tensors)+ N: R& t0 m/ `" C" p/ c: s. Q! P
; F* d$ i3 ]4 S& g. i8 Y. ]
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
+ M0 _1 u: s* A& Z. Q
& I8 E" o' e3 \- \! A: Lx = np.array([1, 2, 3, 4, 5])
( e6 f( D6 }) [# Q( f5 Jx, s9 v0 t; t: K6 {0 i
1
4 c5 n+ b3 e6 W* P2
' B) a- J( W. L) k8 J. E- m; E输出:* e" H1 I: r6 ?; B" U
* |' ~5 d) M# R' C# r0 ^% warray([1, 2, 3, 4, 5])
; k. L8 S& M* ]; l# w1
7 U' ]8 `" L0 F' hx.ndim
4 B2 P/ \" R$ k; W1
9 R! l( G8 E5 A输出:
/ E3 T: P* x2 B, H
0 C7 d7 j; n# M; _1
' U. l: L5 Y- }6 [1
# Y8 R6 a% K; n3 }' H3 I9 W+ Y) l我们把这样有5个元素的向量叫做“5维向量”。
5 \8 F* O, g/ d% _% o/ K: v但注意5D向量可不是5D张量!
8 h& X+ G& n9 n1 V, X: T9 X# [& `- ~- i p
5D向量:只有1个轴,在这个轴上有5个维度。
" I+ g& W% q: ?5D张量:有5个轴,在每个轴上可以有任意维度。7 _/ E+ @0 G8 S6 {! J- K+ g: ^
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。$ Y" ^0 r% O( [: \1 D1 L# r
& W: {5 w+ H) |所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
4 a& r! f8 w# A' X+ p
' S# @1 x# N3 J3 S8 m0 r- R# w( R矩阵 (2D Tensors), K$ f' }4 O- E; F9 l
2 k t9 N5 q9 R+ b, E
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
" }9 Y. Z' i( b( O& r
# l5 g0 v; x: z8 p; _8 B& F! zx = np.array([[5, 78, 2, 34, 0],
5 O/ }# [& C4 Y- d& G [6, 79, 3, 35, 1],
( D# h2 `- q; F: b" _7 F% i) O [7, 80, 4, 36, 2]])5 u) O, s( {/ {1 g. y1 m) _2 J3 `
x
* j+ h8 v8 A* \1 y+ V1
# s, P: C4 U* j$ P2
$ m7 Z& y. A$ I n: O i9 L7 Y' [3 K: s, f0 e# \, `
4
6 v0 B3 [" F& {: {2 O4 k输出:
5 s0 k% t! Y: M$ C
" n$ n0 `* L/ Warray([[ 5, 78, 2, 34, 0],5 f J6 |$ x8 n8 v$ w' {
[ 6, 79, 3, 35, 1],7 e' q4 F2 o6 `4 n {5 i ]: z8 Y
[ 7, 80, 4, 36, 2]]) _ L! I) ~- E% V
1- z0 p9 }$ v2 z3 \, j) h
2
# L( B* u) E* w* L3 ?" J' k( t3
+ ^' N q* Z5 v9 sx.ndim
4 @; w- S9 g$ E1
9 Y' ]: n, p; G9 q1 R输出:) H q" C! F6 a) M& f
& N$ |; i3 R5 H: |! ?0 ]" d* }2
' I3 c2 X# }2 `: V5 i15 |( Y4 @ T) v( ~% {9 r2 H
高阶张量
9 `$ @ K, Z! R* U+ n% B' ^. M
1 A/ n5 k& Q$ v' g# Y8 O8 X* F& k你搞个装矩阵的 array 就得到了3阶张量。
1 M% R1 P9 I. L7 v; G) h
% J. @% T. |+ V, j( f" [ B再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
# Q7 m% P% Y# t+ Q i: ?: ~7 f4 h% f9 N5 e1 p7 u d% D
x = np.array([[[5, 78, 2, 34, 0]," h$ z& R" z$ g
[6, 79, 3, 35, 1],
4 P! w1 i4 G6 f( J [7, 80, 4, 36, 2]],/ \/ R* ^) t$ S* z# p( Z. H- Z+ G; c
[[5, 78, 2, 34, 0],; w! ^) N, t6 l _/ A
[6, 79, 3, 35, 1],
0 F. r0 H5 r& P* Z( v& }4 H [7, 80, 4, 36, 2]],7 D$ L. z8 M4 R) C4 Q' K' f5 Z
[[5, 78, 2, 34, 0],# S4 B; W3 I# r2 S% ]
[6, 79, 3, 35, 1],
, @8 Y9 f* K, K, _0 P+ ]4 Y [7, 80, 4, 36, 2]]])
6 f% S7 g. M! u3 l! h- x6 R9 Y1 Jx.ndim
$ G) R) M7 D% |0 x1: E" E* M8 Q$ O+ l3 ^" C9 Q9 V
2
2 y$ b: W5 _/ K g# O* c3
2 W; z1 ^& A. r L, q4& I5 S7 X; a7 G* p( f$ _+ d4 k0 X
5( A- w, X& Q. Z! p9 m1 |
6
/ `, w& l' X) z5 K8 I7, Q/ W/ V) M! R- Y
83 a% R1 L3 V. E* q) M
9
$ o' F- d1 G: R2 k3 H! ~9 q& q6 W; L103 c+ P7 v* l6 v+ i' |- g
输出:' P- R6 H, s/ @4 N4 [
, {6 E# ?" D: O: ^+ l- F
3
5 B/ D5 b+ Z# _! i% o- B1* X6 J. h- X# X! G& G6 H/ H" x- c! w
深度学习里,我们一般就用0~4阶的张量。
/ \" _* Z& b- ~* c- c$ Y& w6 v/ H) x6 v; c% b7 r6 K
张量的三要素
7 Z9 @$ i- d' ?* M; z r
9 V- i: _" |) |% s阶数(轴的个数):3,5,…
0 S2 {; ?- T& _/ N, N$ g( S形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…5 l: m }: o, Z8 N) Q& w
数据类型:float32,uint8,…) j6 d1 |% T- P3 X5 Z1 O
我们来看看 MNIST 里的张量数据:
$ G2 x. Y1 R9 `! |
' ^6 a+ ^+ z2 m6 f$ |1 ^from tensorflow.keras.datasets import mnist7 i- L: @4 K0 M$ [0 D
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()( m3 L" ]. @1 q# G! K& g! y6 G
2 S" r) n1 y y; ~' zprint(train_images.ndim)( z$ \- R! i. `# ^# X
print(train_images.shape)2 p3 L% j& o, R, X! B5 [
print(train_images.dtype)2 q7 E0 s$ P# ]
1
9 h6 _- |- V6 m/ Y6 {% m+ Y1 G1 f2
$ J$ X$ {/ z& t- m, d g- s8 B3
9 B& F& `; S0 H5 D! o0 W4
3 c# A( }+ R2 ^) z( y58 }/ N; Q" ^) Y. f: n3 ~
6
; [" h2 P5 r$ t# T/ Q' A输出:
+ {" w- S; A0 ^; W
3 U4 f- `8 g8 s4 y3
& T; b$ T4 r3 ?1 R(60000, 28, 28)& M0 Z' r9 O% `$ x
uint8
; v) G6 i2 G1 X! Z, P7 Z7 H1
) A9 N/ ]& U b( y- B7 V/ @: c6 S/ U2
$ ?, r0 w5 g( R6 v5 M% B3% T f2 n& W8 K% |6 ]. ^
所以 train_images 是个8位无符号整数的3阶张量。
* z& G* f2 e3 Z. b( z: H9 A5 n' i; e: Q
打印个里面的图片看看:
$ G. x) n' }! P$ E L8 i9 ~2 i0 t9 E/ c. r
digit = train_images[0]
1 c# p! H' d9 o" X5 }. [
8 d- ?2 }! X) Gimport matplotlib.pyplot as plt
~+ @$ @- p+ ]5 p3 p5 K9 p) A2 q: }1 I) |4 k: c6 J1 w
print("image:"). k+ L# q; \4 }9 g7 B+ I
plt.imshow(digit, cmap=plt.cm.binary)# n1 d/ r9 ^& b6 z$ J
plt.show()# s h, m$ s3 K) ~" ]/ [" N B# ]
print("label: ", train_labels[0]), \& w6 m C+ Z
1
9 {/ R: q! ?$ U23 A: P2 }9 @# |0 c/ V/ I0 p
3
1 T) D! z6 Y- ^) d4; V* B' [2 J6 f2 s
5
2 t C1 w( u& h2 I' r. m63 L! W+ x6 F6 _8 R9 n/ D4 [
7
8 `- C% |. X& U, K, ~( k8+ T2 I/ l3 ^: G1 F/ E
输出:
( g/ C6 j; x2 t5 T- V+ u: B: Q0 H& o
% S5 `% e/ G1 z* ?0 b3 _; \
3 U+ [0 S1 H7 X7 U
label: 5
3 Z$ g% L$ u. D: ~& j$ b9 M1
( ?8 k2 X5 F* N ~2 mNumpy张量操作
. h1 b2 I- N! e- W! s x, U7 b' U- U8 S1 X( Y5 V X) H
张量切片:
7 C2 g* @* A7 d7 o& K" ]2 \4 A) \1 b# a* h( ]
my_slice = train_images[10:100]9 [( R- N( _3 G# _$ c5 L
print(my_slice.shape)/ o1 E4 ]4 I+ ~# F& q7 t
1 t: U, m0 g. N% C* p2 N k
2- ] l. B% @; E/ z
输出:6 p4 F7 o1 {, F+ d: f
1 T9 _) R8 R4 d. o2 g+ \(90, 28, 28)( A2 B9 i/ T! ?2 A; p) M. P! {
17 d* N W. ~& @7 e" n+ V
等价于:. d& [. ]! g9 n
: W" G$ d# ^3 _ ^. ~my_slice = train_images[10:100, :, :]
& o) x- o' |0 ~) U! t5 u6 i( dprint(my_slice.shape)- I+ ~* j, |7 M! k) d# [& K; Q7 h
1
5 }2 w5 ]& L# i! G' U2. P. H3 ~7 {& Y$ u+ d( `5 u8 w
输出:
, w4 z+ z% L" n: g/ q. L
9 N2 j& B# W& ]# L, a(90, 28, 28): ?5 q3 T, R8 G4 f7 W% r/ k" _/ n7 [( k
1
% s1 o0 U, V3 ^6 V6 L/ p也等价于5 L6 k( w6 K, ^- ^2 A
/ j% n' { T7 `- c& I8 x& l
my_slice = train_images[10:100, 0:28, 0:28]
: @* v- v9 I3 c+ I) A" Kprint(my_slice.shape)4 x! {# }2 Z$ P% C( \
19 r3 I4 b8 }% Y8 L+ K6 [3 T
2
. [7 ]! m5 |9 I/ Y; F& M- P输出:
0 d9 k+ \* L9 A0 r; U$ f
# T- ^% t% b1 \- u(90, 28, 28). O' {/ E) h4 Q, z$ c9 v- T
1
( P2 f D0 s) o选出 右下角 14x14 的:
( u S& O/ E2 Q: d% R4 | z/ E! P v3 M! j. v( f/ q+ D
my_slice = train_images[:, 14:, 14:]0 {% M: f5 d2 ^' W& } b7 N. a5 ~
plt.imshow(my_slice[0], cmap=plt.cm.binary)
* k2 E% u8 F }! ^0 M X0 D2 T2 Rplt.show()" } E4 y+ q1 @8 F
1; Q9 T ~* L4 X$ ] i
2
1 i- O) H/ F* x s& k$ E l3' i Q$ R x0 }( Z& l3 r q8 |- o( |
输出:
7 K) X9 a5 g* m& l7 X6 [6 v$ A) U r) u+ k, d( q) F) k
$ {6 Y3 ?, T8 y. ]
; g i0 h8 B" X6 c
选出 中心处 14x14 的:
; W0 |2 Y6 ^3 q7 I) n
. O8 h/ S4 i& M; wmy_slice = train_images[:, 7:-7, 7:-7]
8 y1 z2 G8 i! z' z; bplt.imshow(my_slice[0], cmap=plt.cm.binary)
D6 t$ X/ k2 L5 W- S/ Aplt.show()" k& g7 u) `( p: o5 a2 x) e# D1 j
1
' y/ G6 o3 E* K6 m28 N6 \: ]" o, b
3
* [2 H2 N L i3 K. u3 ?( Z# r: \输出:
8 w' J4 n, m/ f4 q! n2 k$ S: P, W( `9 C$ \7 @% ~% L. n! S
2 Q5 u. {& ^) V" _
! c9 w3 R* d% j" h6 R数据批量* _, G% i+ Y8 ?( n- ^8 \
" n# R# u, {9 m M
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。) e, f4 ?) I8 g
) }) h- c* r1 w) R( b
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。$ Y2 ^ k7 @' ?8 I2 Q, L9 `* ~
7 B7 ~0 @2 k# _: U& W7 q在 MNIST 中,我们的一个批量是 128 个数据:+ z/ C+ w. N$ ? F" {, p6 C
3 i1 ]& X' x5 F% @6 _5 S) o7 E# 第一批: t9 X$ s. S5 r. \) n
batch = train_images[:128]
* t* o) i& ?% b: m# 第二批
( _3 s' x8 I$ K3 _( B/ abatch = train_images[128:256]
5 e* Z8 b K, ^: d0 K, g$ `" b" B# 第n批! j% K7 l7 |0 b ?) }; K% z$ ^
n = 12
3 ^. x: c* \- h! Q, |+ cbatch = train_images[128 * n : 128 * (n+1)]
# s. k1 c3 |7 |8 l" q16 e/ W5 u4 f7 {" G
29 f) s6 c$ W8 U1 n3 Y$ T2 U: _
3! }8 ], X' I3 [! Z3 Q m
4: _. p4 D5 J* c7 K6 u$ l
5
+ a# ]0 h5 Z2 o! x4 h' N2 u" \" ^9 U6
8 L& V2 t e' x1 n7 v7$ }8 _+ _3 X/ |* _- p% K
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。+ n& k. ~- H3 _
4 Y( w9 d+ e4 j8 x5 @: f, ]( S
常见数据张量表示9 j+ t+ c# W5 `3 w9 j- E
: n8 A. p% u6 J数据
* S- f+ J* ^( u& T4 I, X |
zan
|