- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565360 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174831
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
, X" {6 o1 G: ?0 N8 l+ n$ `Python深度学习之初窥神经网络1 }' V2 j1 V$ Q8 S6 ]/ r( u: A
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
" t. y ]# q- W7 @1 A3 S
7 z; N2 w$ x# _. X# n本文目录:- G- A- p7 z) x
, v4 U8 u: {& k2 g& L/ Y文章目录1 v3 V l6 `4 _) K1 u& s8 I
9 f4 A8 D8 g) X( p) B% ^! ODeep Learning with Python! v( q2 r; L$ U6 C
初窥神经网络) q# T$ P4 g; q: I1 T
导入MNIST数据集% B2 p+ @+ f9 W( e3 }
网络构建
2 i" x5 K1 Q& p7 ]* k7 L1 J编译
* t" c2 C2 V& V- l- G8 o预处理
) Q8 T# m$ H. a) Y" J; B图形处理: p3 X- U0 ], R' U; z
标签处理
# u3 U; m2 R0 [+ G训练网络
8 J: ~$ P9 e0 G! l% K神经网络的数据表示, d/ a3 ]5 J" @; s4 J7 q6 X/ K
认识张量5 R8 O+ R8 G Y1 \" \7 ^( K
标量 (0D Tensors)
8 @- C; }" x" G2 n6 h向量 (1D Tensors)! k) u, H9 ^$ F1 E
矩阵 (2D Tensors)% G# K3 S3 z# q: P B
高阶张量+ d/ ]. d5 B8 M( ~
张量的三要素6 y) g- ]1 k/ m2 P9 S n7 y
Numpy张量操作
+ }; f b% k. f" @- ^8 ?张量切片:
% y; M6 Z" {, W9 H- D数据批量
1 d; k/ G4 ~, N, s) N# h9 m8 r常见数据张量表示
2 w H; y- T% Z2 m, s+ A+ e神经网络的“齿轮”: 张量运算
1 Z" G5 O/ u2 A逐元素操作(Element-wise)
1 r) ?' {$ `: w, A* X广播(Broadcasting)% r( b8 w' C9 c! l. H
张量点积(dot) O2 X0 Y- H' {5 C
张量变形(reshaping)
6 b' Q$ z. X9 v, M, D1 c神经网络的“引擎”: 基于梯度的优化" `- s: Y4 B9 G% l& {* b
导数(derivative) Y( {& o+ S! t$ B
梯度(gradient)0 S& T, t: t3 [5 M( u6 I, D( F
随机梯度下降(Stochastic gradient descent)
# s4 w% \9 W0 Z5 n3 z5 X反向传播算法:链式求导 n& ~9 m& [3 F& c& V# T1 d
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。 V9 ~5 L% B7 f. B! M
% N V, X) r8 L
初窥神经网络6 _# [+ x! k q O1 Z# j
6 h/ l. Y$ k% E; J A学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
+ d, Y, T! Q" n0 {: d% Y+ X# n; D; }
1 M7 Q3 _% v6 pMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. l3 c8 j; y/ O( {$ D+ N9 ?/ f
% D' [7 L8 `) ~导入MNIST数据集6 p6 i6 }9 ~! Y1 a) J" ^
, {) c0 n D& \9 T
# Loading the MNIST dataset in Keras& j K6 e1 |* D* @
from tensorflow.keras.datasets import mnist8 t( [1 R! j- n& ^
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
6 k" @# ]) W# C- z6 k% T17 g# C/ M/ b: l8 o }
2
+ B" C! i4 o3 C+ z" g2 S- H. ~3) u! Q* y5 x7 m4 G# M/ B5 K6 h
看一下训练集:! a( E; }7 ]7 z" u
# L, t& ]# x8 g0 }- Kprint(train_images.shape)7 F! S) ?$ e0 v' q
print(train_labels.shape)" R' ^( v; A) n$ |' _8 u
train_labels
* W# Y; N! `6 @$ b( i% }1
/ g8 {$ W3 ~3 s7 A5 b2# a0 b1 ^! @+ e
3+ @6 z& h2 q$ l% ^
输出:5 F* h' L3 |! G* z7 B
8 b5 x3 a+ W2 E. c/ ](60000, 28, 28)
) n; R7 y9 E4 ](60000,)9 \9 R, f8 @! S
6 e' n* [3 ?, f1 A, warray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)* u' e% f+ E- g# I
1) Z, x- X! |9 k* B# W4 j" f
2
& y' z' J( x V" n+ @, ~# b3
* d6 C( U0 v4 E1 D4 r$ {4
- J2 y6 d' s7 j这是测试集:
( x3 c1 V: i& w1 ?$ S d5 p- j' ]; D7 s! e2 W0 g6 {7 z6 ^! s3 `
print(test_images.shape)
% U7 T: L. K. L- ]0 B& j+ zprint(test_labels.shape)% l& T5 o- v% t. T/ e
test_labels
3 u' o7 \0 t1 c2 N5 i1
# h: L: q' L }! H. V0 E25 y* @1 R, f" i1 p1 ]) V# n1 L
3, o9 S; C, l* y) L% O1 t
输出:: Y' P& J" Z0 O! A3 C
& m& I: \! Q2 h(10000, 28, 28)+ a1 Q/ |/ D6 l, h7 x: x
(10000,)
: D/ I: I6 g; Z! }$ o5 s& j! u, a, q* X% W
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
0 ^% h, K8 |. o! m$ X1
) Y$ b. J0 [5 P, I/ g+ A* J9 y# n2) c. T2 ?9 @; E+ I! [
32 K* O0 R9 M& g3 P! `
4
- P4 M7 ^# S" _" v! y% o: t网络构建( ?, [$ s# \3 b: [
' @% b. F+ u, u3 P' Y$ y* j& T6 p& }我们来构建一个用来学习 MNIST 集的神经网络:8 r" |( h1 [+ `( K
/ }# Y, }, Z: _% Jfrom tensorflow.keras import models* g' @. I; {. r. M8 x9 }
from tensorflow.keras import layers; y# W0 _$ {; o, U0 z* [: r
* | b& M! _* z, onetwork = models.Sequential()
% }# u8 l5 O# Fnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
1 M% a# ]8 O% |3 G( U0 z% `5 ~& Jnetwork.add(layers.Dense(10, activation='softmax'))( o" }( Y5 [- O
1
& ]( `! ?2 T+ Y% H0 O, H2
; n ~! @' W& ]3+ {1 _) Q& ^* }9 m# J* p2 q- l# B
4
0 Z8 ]; {$ G7 n5
& z! \+ L- y7 s: @68 Q4 ~* z5 o* m! P+ t) H" V
神经网络是一个个「层」组成的。, F- |) A" ^7 m& d7 m
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。3 Q. h+ X+ s8 B" F7 n/ l5 H
( O( e6 M u8 X3 _这样一系列的「层」组合起来,像流水线一样对数据进行处理。" `1 H+ O" O7 i1 J! O$ A
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
: c* F) |' T0 I+ X7 H3 ^$ @+ U" J% B* I: h/ g
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。) q! G9 p/ u4 o. }+ h
# i; @8 z4 V" ?) E
数据到了最后一层(第二层),是一个 10路 的 softmax 层。
' E/ d* y, P, |1 d这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
* D0 G6 k+ w: X7 H) O) R事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
# I/ J! m# |+ r1 _! H
0 v, v) G5 H0 a% F编译
6 N2 p5 ~9 T5 n: l8 t2 X* q u. b2 g" j! X# N# J- R" T, b6 F% [/ V- d
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:$ L- c5 L& u( R% d# ~; b/ X6 `% n
+ L6 K$ N4 z9 T# B7 e- E/ l
损失函数:评价你这网络表现的好不好的函数
* n' l8 a E! n, Z- ^+ u0 F优化器:怎么更新(优化)你这个网络
0 P& {5 y' u# x1 X训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度$ I$ ]7 j! ~( w i
network.compile(loss="categorical_crossentropy",: c5 a1 L$ a2 N% o
optimizer='rmsprop',
- G5 q* t' S: E: | metrics=['accuracy'])8 z/ V5 K) d2 B1 X. S" M7 Q2 g( V
1
' i, b' F! f& X& [9 Q/ E; P! h0 z28 j" ]6 @# ]8 ?! u: A
3
: G& K2 s* q8 t& U% K预处理
- ]' n9 Y6 y6 D5 K( g# A: s' f8 Q B* k, Q8 L9 [& T' |
图形处理
; ?' U! h W# Q% X( y
, j. Y O) Q5 h2 j" f# Y我们还需要处理一下图形数据,把它变成我们的网络认识的样子。0 a% {) j/ o) |7 j; L
1 k2 |. r* |" _6 j
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
) Q, l8 h" V; ?8 V. t而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。2 {# ^; ]2 u8 ~4 J# E5 N# d
6 P, P2 O& v2 ]- E3 Itrain_images = train_images.reshape((60000, 28 * 28))
/ M; y* S$ I9 ?8 w9 c$ s. ytrain_images = train_images.astype('float32') / 255( O$ A3 E+ Z# P1 f5 P
% p1 ?' l! L5 l/ l0 f
test_images = test_images.reshape((10000, 28 * 28))
: Y, p: g8 g7 B' ?4 Y) ctest_images = test_images.astype('float32') / 255) U4 e/ L* m( x1 q; z6 c
1
7 H+ w) S' @! p& y2
6 ^6 g% `" g2 ]: e: s3+ V4 {# v3 m5 K2 ~) R
4) M: @# G6 q1 B) l3 W! h: O
5
) e. H( ~; v& r- O标签处理
) G' M5 V; W4 J) J# s- m* S D4 d& L* T' X9 }+ U
同样,标签也是需要处理一下的。+ W9 X% K( R8 S9 F) d! t
: r1 k7 ]$ |2 ?from tensorflow.keras.utils import to_categorical
+ x/ v# T; r z' O/ K; t3 b8 p. r9 C5 P- V. p& h) m/ ` s4 T# f2 j6 X
train_labels = to_categorical(train_labels)0 M4 Q* S/ E: u- N
test_labels = to_categorical(test_labels)
! p7 Q+ {- T+ C7 `17 @4 T# d5 ?3 A! j* g, |) D
2( [- d3 q/ e5 r) W# H" X, o
36 ^4 R& w1 S2 o1 P# F1 j ]! f# b# P4 i6 g
4
9 U0 S$ @7 r9 s+ t2 l. m训练网络
0 W" n" x5 M& e, e r1 u7 u
5 f+ z% X2 m2 E. G. }9 T2 Wnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)% N, f* v$ t* F2 w& ~
15 z2 y4 K4 U" K7 G- k! p; H
输出:
- ^* j$ r: ?% D7 c
. q" j9 U3 ?5 T+ M" a6 d9 OTrain on 60000 samples* D7 e0 X3 s9 O' r2 i2 @
Epoch 1/5( U3 A, U* B& ?' c+ V* T3 U
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
1 t' r; P) I8 h% T" g% IEpoch 2/5
6 F5 z! B. p" c& }6 H6 P$ g1 u b, d60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
+ p6 m( h, g' a6 g9 @ e" X, {0 k( ?' AEpoch 3/5
+ z6 Q3 M; L7 \8 `: e- k60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
! B. B4 U/ i3 @/ ^# `* Q) LEpoch 4/54 x5 M$ _5 O4 @1 ]' T2 ]4 N
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848 S D, F9 T, j
Epoch 5/5
; v! @# y7 h5 a* v60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
6 ~& m) f0 T# X' i. i
7 d; c% z% r0 T" L$ ]<tensorflow.python.keras.callbacks.History at 0x13a7892d0>9 |1 k3 @& \* k. L
1
/ W$ \& Y3 J* p+ k* L9 l4 N3 t3 y2, `( A7 H$ S5 f" M! i
3
$ G3 f5 ], w. d: h% Q% T% j4) |' L! J+ L4 {5 q# q
5/ z& \4 ^' _0 N/ ]" a+ j4 o
6
3 J: ~( m+ a! ?71 T5 f3 {# M6 C: k
8
0 j4 ~8 N0 Y; ]. L9
. Z" Y$ g' O5 [8 O F10# J7 b) g/ D3 n$ }* j( X1 H7 ^7 T" H8 C
11
J% G" M) L+ a+ v9 E3 Z12
4 E c7 g! V/ l+ V! C2 `133 E" Y- k5 Y3 t- F# D1 g
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。% `# Q3 ]1 p# D
% D/ G7 n# B/ m# {" g8 u再用测试集去试试:
- J! [6 }2 C2 ]6 Z
5 B! K2 ?5 }: u5 H- itest_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: j) J4 k8 N0 s6 p0 l2 T" C5 z R
print('test_acc:', test_acc)' i0 s6 F" Z5 p
1( `1 v9 q. P$ A9 A! ]
2
8 U9 c$ Q% _% K输出:, j* K! P/ n# N
, f7 Z0 Z, z9 G10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
3 K+ F8 o* q, @$ v* T" X! ktest_acc: 0.97899 _2 V( y4 p2 [8 `
1
- I T2 ]# w- S2
$ L6 r+ i* y T2 _! v* d" C我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。) V9 J$ d3 J1 ^/ W, g' J
. z1 l* S) D$ O* ]神经网络的数据表示, t: I9 {- y4 |7 n' `1 G; D3 [; @$ O/ a* L
0 T. J f6 h9 ], h# [& } O( x5 m" fTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。) Q. k6 ~7 d; {" B) Q" h+ |4 y
9 K3 |4 H n1 x# [- f$ t我们常把「张量的维度」说成「轴」。
" G/ C7 Q) m+ v$ ^! Q. _
6 }. ~$ ^8 x+ U- e& o' j/ P" |- \认识张量
* Y4 o9 H$ u" g4 s+ i
; Y6 b) K2 k6 r: N" Y8 D标量 (0D Tensors)
7 a8 p; S; i$ R# g4 e
# G4 b/ r4 }+ b5 OScalars,标量是 0 维的张量(0个轴),包含一个数。
4 {/ D: N/ ?, ~' }% A2 o
( T5 O2 @" z( x0 i6 Y/ Q3 h标量在 numpy 中可以用 float32 或 float64 表示。, I/ x4 b2 M: D
/ G# m* C& z6 w* L) l6 G* n
import numpy as np
4 c8 |5 x9 b r- O8 O. ^: i0 K, P4 [+ X# D9 u' B# j c0 K! W
x = np.array(12)2 k; M6 N8 u& V1 w V
x1 w, O2 _# l# u9 E- U
1
1 F% w5 d0 |) k* l, V% x0 z9 i2" Y# S! v- @! y# }9 e! x3 [
3
0 w' ^/ S N" K4: A0 b& D- h1 k% B9 J {
输出:
, L6 [3 \1 |& S0 {! }0 H% c0 D" p" N! q9 y/ w, y) ~
array(12)
8 O8 y- Y& M. L% I1/ V6 M' d/ ?& u7 P/ Q% v
x.ndim # 轴数(维数)
) H. u8 f- z4 ^: C" W- @/ Z13 C$ A1 b: N! L; H8 d) R) ]
输出:/ u: _4 q5 v9 @
2 E8 G- i% u$ U9 e& g1
o' y3 r6 C" ~7 k1* w/ l% H' C [! x/ t- v
向量 (1D Tensors)
0 M, |0 A" V( \' B0 \; [% Z
Y* e( e7 e; ?7 ?1 o- w( ^- cVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。! b p3 x; \9 [1 A+ G0 @
2 L6 D# c; ~8 M# k- O; Gx = np.array([1, 2, 3, 4, 5])
) F; a. m& W! C3 T' G9 t, ex
* c. a4 d7 o% l5 m1; @% C" `) |% ?7 z, |5 U! f& S
2
6 d+ u+ L/ h. F输出:
, W3 G5 M! {0 ?7 l6 B! P- W) c2 ?6 W0 k
array([1, 2, 3, 4, 5])* ?: C* K* L7 R8 @# N
1
* a; d3 |- H- g0 j5 Q7 Ox.ndim
7 {& M) O: K& a' w1
2 S( @+ V, r# M输出:
) }& g, c: }5 i. Q: u
* O/ z' T; M0 w9 |4 K1
! s+ c0 `+ ^! i9 l, a2 `1
T2 D% I; u; I" e我们把这样有5个元素的向量叫做“5维向量”。
* i: @1 `2 Q+ `+ o但注意5D向量可不是5D张量!
# w8 d9 ]+ h0 c5 o; ?4 |1 v3 X5 H5 p6 m& e) \5 E+ S
5D向量:只有1个轴,在这个轴上有5个维度。! {8 l% y8 r! f# p5 v
5D张量:有5个轴,在每个轴上可以有任意维度。
; n5 ^7 |8 A7 I( f+ ~! X0 [) b这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
2 G+ ]+ Q$ j9 ?" }& s. J- e' e/ h( c1 y. Z5 l( Z
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。+ Y! ?3 n- m) p1 c2 H, c6 Z
6 n' J5 f7 Q# L5 Z7 B矩阵 (2D Tensors). x5 S3 ]- Y4 V! M7 c1 k
; r- ^+ b8 n# U1 Y) m' Y l3 z% fMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
" G# d& [+ z$ y; g
& u5 b+ F* h% b2 l9 {) H1 cx = np.array([[5, 78, 2, 34, 0],
4 O6 b& z, |8 J R' v [6, 79, 3, 35, 1],
; b/ m! C* @4 Y; }5 Z [7, 80, 4, 36, 2]])
1 b8 L$ |9 a% t! Xx
# Q ]5 d5 {; J7 e9 E( n2 a1
" s1 G# f$ x& u2+ Y+ F& J8 n$ g" Q" ~ Z' I% Y
3- X, p1 i8 x1 g2 ~8 d4 F" B9 d
4$ g- [" h+ z4 q1 l/ b5 `# G8 c
输出:0 B& _$ E% F+ o& ^- u* E [
, j/ b1 r9 f7 A5 ]. C- h
array([[ 5, 78, 2, 34, 0],
8 J, ^. g9 `3 x7 R5 d( d [ 6, 79, 3, 35, 1],
" K& b( ?& |" G; A [ 7, 80, 4, 36, 2]])* W, l2 I8 u( g7 ], z
1
( f; \2 Q, W' {) w Y2 O \2 E8 W* r; q. H& K4 i* S
3
0 d( p! N6 M$ Y& b% {/ Nx.ndim) W s" y A4 d' R* ?
1
* _# D4 G$ A8 \. b% l% _& c7 ^; j输出:2 ]+ l }9 p0 R+ O0 L$ H3 i( t
) g! r+ O3 f6 }2 r
2% t, o/ f/ ~) ?& {6 ?! i1 P
17 ]' b. c* g* F8 H$ ~
高阶张量
+ B( O" O* J, S5 n: G4 e3 I$ }/ |: h' ~5 [
你搞个装矩阵的 array 就得到了3阶张量。
9 @$ s. g7 t* D4 Q% h8 C. `$ K/ l6 z6 m. @8 @* d
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。* o. t& G, {8 c/ X( N6 ^
1 R; X0 D1 p7 l% D0 O4 r" g& ]6 fx = np.array([[[5, 78, 2, 34, 0],0 C0 r( j1 X0 Z5 O# s8 [
[6, 79, 3, 35, 1],0 p1 g* b" {) _6 q
[7, 80, 4, 36, 2]],& ]0 d0 {6 X3 }5 ~" k/ V+ e
[[5, 78, 2, 34, 0],
. {1 e$ O/ y3 a' A [6, 79, 3, 35, 1],
% Y6 x5 S# W! ^: P9 P [7, 80, 4, 36, 2]],
$ a' @5 o/ ]) n+ r [[5, 78, 2, 34, 0],
4 r5 o, A* W. w' j, n& n/ f! N | [6, 79, 3, 35, 1],
5 O' f; q/ m5 H) M0 Q [7, 80, 4, 36, 2]]]) j' f2 s A C) L+ s& s5 D
x.ndim
% Q( L! N! D/ V' I9 q2 `1
' h9 b/ H% \. z. M% o, K( w# s3 w' z2/ l1 f, I' L- R8 }
3
) {8 y# B: @/ Z1 ]2 _; I9 M3 c) S; E4
$ t" ?. d6 M$ [ p O) t" e* U3 Q5( W" h; Y7 j1 I% X, a0 K& |& |
6! J' E+ c8 D( Z# m
7
" K, g! C. \6 `8: Z. a k: d; j0 R3 I. u
9
% P% j' |" M" p& l& M0 N) c10
1 A' ?( e/ l+ Y) P输出:
5 _$ Q, M6 R4 q4 v0 C( ^1 J" g; M5 j6 [6 ?8 d! ^1 {& ?/ M7 r8 c
3* g( S( d6 C# z0 P. G
1) c( d7 e# I# ~: _6 F7 [. d% F0 L
深度学习里,我们一般就用0~4阶的张量。, R3 A+ c6 f5 ]% ^6 b$ Z; z( f& M
; \! U% {' z' q
张量的三要素
, e3 ]/ R! a1 q: Q* U' Z' {3 n1 s$ S" W6 H: h; O7 i
阶数(轴的个数):3,5,…
h8 H% }( w4 W O6 S; T形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
+ k, V o4 A0 @ i) w数据类型:float32,uint8,…5 B1 v7 E( H" \! Z0 z
我们来看看 MNIST 里的张量数据:
5 z1 ~ r; m6 S8 X/ j6 W3 y, f7 h+ d& u; q' i6 h) ?
from tensorflow.keras.datasets import mnist4 X) S( P0 |0 ]4 \
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()" A$ e8 Q, X2 Q- P* \9 v r
4 V7 S7 l# N) s% K- Uprint(train_images.ndim)/ {4 G6 e, Z1 B! R8 X. @4 r
print(train_images.shape)
/ u4 O; z& G7 S% h8 b, m) ~& `4 dprint(train_images.dtype)4 Y8 A7 O( a7 c0 k7 t
1
$ O4 p: b4 ], s# V+ l7 ]* ?8 y2( [2 K! q: ] T4 S- `
3" b5 ]9 M$ T/ L2 n) p
4: B/ q" b! v4 S1 x; x2 ?0 T! ]% ?
5
) F# y( X/ }; O* U4 }6
* O3 ^0 A4 w% z$ y- M7 K输出:3 z! A. J1 W1 G4 {
# Q* f; t+ V. C: z
3
7 B M7 d. @* A" r5 p(60000, 28, 28)
. k& k/ c" g g6 u5 c+ u3 auint8
$ N. ] i9 E2 w- [' g2 v% W& j1
; h* I( z+ B5 x9 `) i28 P6 }5 s' q! N" D
3* @3 x% A J" r- g; v# @# ]0 }* E( i1 d2 k
所以 train_images 是个8位无符号整数的3阶张量。
- `- z, k" M& E! }5 v* W; t( a3 P4 j4 {# D
打印个里面的图片看看:4 ?! f8 n8 F5 s1 j+ y4 S
, y" B2 p" b; U" R; i3 _! H4 Adigit = train_images[0]
$ Z$ Y- x+ S) J/ f3 M0 v$ \- P
; {/ r) x2 R& ]& s7 v# dimport matplotlib.pyplot as plt# q+ _' I$ l0 ~ W; H1 x6 M
; |' S5 ]/ y' Qprint("image:")
1 p, {" y$ ] L5 T: }; m+ D3 E9 ^9 ~- l. Yplt.imshow(digit, cmap=plt.cm.binary)# i; |& O9 {/ P& h
plt.show()
! d9 N, p& `5 F# b) uprint("label: ", train_labels[0])
3 k6 S4 y2 l" w4 C' X* k1* X1 p6 Y. e4 ]* |! P) l9 ~7 l
2
( y: [1 S A' H( F& @7 \9 ] H% A3
5 X7 J- Q) p+ c6 B! j4 l) o+ x4
2 x, P% }& \, y* U- ~! o! t* i7 X5
# F! h* K; }. ]6# B4 L8 c# O! M6 {9 N$ M
7
% |5 d0 c6 ]1 \7 E' x" \+ U8
: q R9 w+ @. L输出:
8 E& W4 I7 U' ]; N
" Y& q+ s' _) z* x
9 w) r3 k5 B4 ~# _5 u2 b! |
+ c) n& ~" }3 a% @+ P; O1 L' olabel: 5
& G* C8 y3 b" d- K1 n1
& f# S0 _# x( eNumpy张量操作
5 [& H0 T9 u* Q f3 y5 a8 q/ G. G) s' y0 g1 s
张量切片:
7 i; f- U6 C/ [2 l0 g- P# E
3 x; c4 D5 a+ p4 w. smy_slice = train_images[10:100]
$ b1 x K' T5 \4 Rprint(my_slice.shape)
3 M3 u1 [6 T) `3 G1! M' z( c& N6 r
20 G+ N8 v7 _" u" J7 i1 F+ I
输出:
4 h4 @6 X g% P2 A; V
9 _' U2 A7 N! N
(90, 28, 28)
( ?, X* K! J+ A: T5 ^" K$ U ^: A6 S1
# s7 W/ G" i6 I9 x等价于:
1 L/ M6 |- p" n* i9 z; J$ a5 \( V% b
my_slice = train_images[10:100, :, :]( F+ a2 C/ Q2 Z
print(my_slice.shape)
/ V3 w4 p- ?5 ~- w( C _8 P1& w A4 f4 s$ E# ^$ n
2
! k+ q1 S1 x3 B% N输出:' D- Y i( H6 f0 `
- `4 R. @4 y$ W( I5 K5 @
(90, 28, 28)5 j3 t Q: m ?
1
; r/ g1 _' B! ~2 D6 @& p也等价于
, @1 w" q$ t! ]1 B: `2 L" i
$ G+ B* R9 h: k: M; E- V* n0 Gmy_slice = train_images[10:100, 0:28, 0:28]
9 v a: e3 y! O+ e/ cprint(my_slice.shape)
v1 L g" Z2 r9 f$ A) k, a, L4 i' {1
# r) m5 A) w" h4 \, L23 B9 ^+ J; U/ S. m3 c- E
输出:) t2 v' a$ R S: }6 N: s3 K1 p( _8 y
* ]* p' f3 ^! E/ s! o% F9 ~
(90, 28, 28)
* C v& x- l& v" n# A1
9 {7 B, F" D7 U4 ~ x# P5 m7 c选出 右下角 14x14 的:
7 a$ j3 J0 g9 R6 H& {
' q* Q1 D( g0 P+ X6 B" G1 Bmy_slice = train_images[:, 14:, 14:]
r( p2 o+ Y& m% t+ }- Q" P! m6 Cplt.imshow(my_slice[0], cmap=plt.cm.binary)( } D, k# D& I
plt.show()9 j. I7 M3 l6 _8 m; G
1
& g3 I" G" a6 `1 }% Q3 `23 `' U* A; B. l
3& t' x+ Q& z4 Q5 h
输出:3 ^% p) R1 c2 z( p/ r
) |1 Z( h8 `/ W0 Q& D
7 ~5 `/ e& R5 T. W/ X" d( V' F: p6 u' q- S3 L
选出 中心处 14x14 的:' l4 K" U' @3 R" |& \
|5 ?7 q3 M. e( J# y7 p5 ymy_slice = train_images[:, 7:-7, 7:-7]0 U* f/ o# t7 l3 H; v; k0 t
plt.imshow(my_slice[0], cmap=plt.cm.binary)
& R0 J( c- t }* i8 dplt.show()0 Y d6 B m+ [/ F
1
& u9 l/ {4 ~7 @9 o2$ F/ o/ D6 H+ U' ^7 }7 ?* |
32 B f) T: q8 P; o
输出:
# N, t: n) e& }, k7 P5 v( z
! o5 [1 p4 c# \& u1 L) J* b) `, O+ [6 P1 E) [
- @1 u! B! P4 B. n6 h
数据批量: g) r" A6 v1 ~/ \% Z
: Z) |( O+ Q1 r+ K5 P& d
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
# X1 u- z# U5 |: o4 p" \# a( e5 m& v0 G, J& R
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。8 T6 T. `/ N- P+ Y3 u; T0 c( b' i
* S. Q: `; w$ r- r3 O8 L在 MNIST 中,我们的一个批量是 128 个数据:
& l" R, m+ c! O+ N* ~. u
1 F! e; ]% ]6 \5 S7 R+ m$ G& e# 第一批
, E' F. R. ]! P. G0 Cbatch = train_images[:128]
$ C7 u# @4 o' J9 c7 B4 Q# 第二批7 L, A% f, O* C0 f# W+ D" [
batch = train_images[128:256]8 T! Y( e4 @' O0 o5 j
# 第n批$ S u$ I ]' T& B2 ^
n = 12
$ Z0 F. B+ p5 R( k$ u& |batch = train_images[128 * n : 128 * (n+1)]5 t3 g" {$ Q) R
1
' E+ g! Z0 F, c8 J a) n/ k% s. ]1 n2
g _. p; U3 M% @36 {, u9 c: f) `8 }; k* S9 P& \
4
( c0 M c/ E( I( p1 c8 Y5
( E) T4 t; j7 s6
0 S' H( X5 G7 E; t& [ Q) K. Z7
7 w2 ]- m) {! x* f2 f$ ^所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
$ a8 e7 H' F' r3 k" S( N& N7 l2 X) ~" o. f* F3 b% X
常见数据张量表示1 V- X# |- l1 |
6 z0 b4 ]- X# g
数据) |# r! y. \2 f$ P }$ ^/ c' j" o
|
zan
|