- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566467 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175163
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
. ~" X; \) M/ S( j7 Z; y9 S
Python深度学习之初窥神经网络
# J! `% v* K) D6 e; [本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
; W9 U- F" ?& B0 i0 r( ?# A& ?4 Z/ s$ t
本文目录:
2 c P1 G+ s+ ?( F$ o
6 u4 W' z4 j/ Y6 f8 T5 ]3 L文章目录" H' \0 G: F/ M" Y
9 y# M1 S9 R, a: Y" m5 iDeep Learning with Python/ e* H! Z6 i8 o" }
初窥神经网络) H+ Q9 D2 N h1 O) Z- \
导入MNIST数据集9 x0 u( v& c. V. V8 t9 S
网络构建
/ h- r* y, ^* h& K编译
- e% ^: i1 I! v. G) e* f0 r预处理
. _/ x) Y; {; |' i图形处理
! M L, }7 o5 X标签处理/ n* r- u& a+ V A
训练网络
- a, i% A2 f& H+ u9 i2 ^% n神经网络的数据表示
8 E0 }' M* c. f7 B9 w- t认识张量, m& V% n$ E1 z2 p7 |& {
标量 (0D Tensors): W; D* w5 E8 v
向量 (1D Tensors)+ T2 z5 B+ U/ i
矩阵 (2D Tensors)
# [6 x6 J; E6 q5 W5 K0 N高阶张量+ a- X) p, i2 Y1 v& `
张量的三要素
: d: C! _: n3 d1 }) N) P) ONumpy张量操作
9 t: ?0 c2 _1 W! F) C- N) g张量切片:" ]1 Z4 a( {7 N& b7 d1 T* U- u( m
数据批量
. b' d4 Z# s1 q7 @" o5 K常见数据张量表示2 _% d0 Z; `8 r9 u i
神经网络的“齿轮”: 张量运算
0 _) i# K. h% }: V2 _逐元素操作(Element-wise)2 o0 Z8 i5 O* R2 {& b, F
广播(Broadcasting)
# O$ Q, p# A! M. L- y! H张量点积(dot)- q. `" d1 Q6 y/ {- @
张量变形(reshaping)& A2 p7 K3 @* u5 _! U
神经网络的“引擎”: 基于梯度的优化
. ~9 A/ s% s0 ?5 X$ h# @导数(derivative)0 W& G$ w7 X- l; }' G$ S: d3 J
梯度(gradient)
o- y2 v' M, @5 F随机梯度下降(Stochastic gradient descent)
% t4 P+ r& F* ~反向传播算法:链式求导2 ]) ^: @% |2 q& a: v0 V
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。; w0 z$ M& N C# g! z
- d$ s- v1 ?* `! A0 L, }
初窥神经网络
, V6 l! u: g5 _2 h8 m: Z/ n( z0 e: Q* I* E/ S
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
" Z7 j! T4 ?+ s+ k% ~) G& R0 ]# F$ x3 J2 K2 p c
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
- b; I* L. ~! N' ]9 g5 Y, O0 J6 D+ f* D- V+ e/ y& Y
导入MNIST数据集
+ o {, u9 y# K5 S* t& @+ b7 y7 a4 T# N0 s
# Loading the MNIST dataset in Keras
& L/ C1 F# g: p% ~8 T& E6 ^$ Tfrom tensorflow.keras.datasets import mnist
- P0 C" F* k B- h, |* A% Z% A(train_images, train_labels), (test_images, test_labels) = mnist.load_data()+ v7 i7 X. Y. g! E+ t
12 g8 U$ N6 [' G8 V
2
6 K# e2 a6 c$ c N [+ E. E' L1 h32 T( b" C# U- ?5 I% _& X. C+ ?* U) z
看一下训练集:
! ^- Q1 X% ~3 j: \. p7 j
d# T; Q- d5 R7 }print(train_images.shape)
D% W/ H2 M; a/ Oprint(train_labels.shape)* }- A1 I0 @: _
train_labels
. o- @+ T2 `" l* r% A11 D1 @5 s* P5 q; c( A
2
$ g! b2 I5 j: K6 X; J3
2 k$ m. m1 c$ o `输出:5 O4 z, |$ ~ O$ f- F5 j1 F
' l; H6 ]) M% g; G: l; H
(60000, 28, 28)( z4 `# U& ~/ D& A) k0 A
(60000,)
- z5 O& D7 z/ n! R8 @% P
- {# L) e- @! u" c1 rarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)" p( N1 `6 B1 m/ \! ^. B( ?
14 l7 b# K& I5 r! j
2, n7 d" R8 L- w0 B8 `) s9 f6 q
3% h" G* g2 K* m; U# ~8 V1 l: Q
4/ N9 p5 X9 ?) n6 }
这是测试集:
# L d6 ?- _6 g# l
7 X1 e- A- ?" G; xprint(test_images.shape)& f" E5 G+ T0 a! l; Y' ^
print(test_labels.shape)
9 A" S W3 a/ Y! N9 D' `. M4 H3 T- ^test_labels3 b5 i4 M. p! I9 H7 Z3 f
1/ l* \) ?! r* H
2
8 v4 w3 U B0 L3
4 x' {% y: ?' R* C输出:
" ?$ l: F# [ @& M8 Y, n3 H2 Z# A$ g8 [; E$ p9 ^
(10000, 28, 28)
2 B3 v% F/ u' j' g! N& I(10000,)
' h @% ^3 d7 |; z `; s. J$ o
4 R) C& u; _. w: I& O# g# r, rarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
9 p1 q5 Z6 S, Q, Y/ N' k3 P+ p15 ^0 B- ], r0 |- Q5 M% [5 y' |) L
2 b4 R" f: P: E9 k N4 t3 f K: T
30 ~7 P! o8 R+ o: ~3 ?1 b* s
4% C0 B9 Y7 {: C
网络构建% |* |0 o& K* b/ j+ @( y
6 I+ E* ^7 C$ g! S1 I
我们来构建一个用来学习 MNIST 集的神经网络:
; S ~7 O# [6 ^6 Z# q
/ P5 I+ A0 N; _6 [from tensorflow.keras import models
+ J P( B7 d& Efrom tensorflow.keras import layers. s5 O4 @+ @0 i4 S6 x5 x. M* ?
6 @9 g4 Q4 z" z+ E: Q
network = models.Sequential()
0 \5 d; I0 \, t( n0 ^network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))3 `" c- K- c, _* m' H4 a
network.add(layers.Dense(10, activation='softmax'))1 S. c" j+ z; ^( B, p$ d% E
1$ L8 g) n6 [( ~ ?% Q7 L& V
2
6 c/ T2 O0 ]1 }31 o+ w; i" k0 Y/ B, Y/ H/ Q/ r
4
* j$ ~& F. r$ r7 x2 L5
0 U4 s6 i. G% C4 t7 @$ T# h6# z# J: O) H t$ E# P
神经网络是一个个「层」组成的。
2 p4 G" I" k7 r9 w% I+ v: |* p一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
v% ~% q) h" u+ O# o- n
# K* p) ?1 Q" ]2 W这样一系列的「层」组合起来,像流水线一样对数据进行处理。
( B# N* }" J1 d5 @9 N" x层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
3 O7 E. o' B4 o s) Q8 X
% u6 }8 v5 }* e; ~3 d6 W- Y& t: d我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
% K1 X" [- e# E/ G, p5 V) H+ f1 m8 r) v
数据到了最后一层(第二层),是一个 10路 的 softmax 层。/ c5 B6 V+ x/ W
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。3 M( j& p) k/ o5 T6 G
事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
5 U9 ?+ W2 U) r9 f0 E# M+ n* c) b( X6 l
编译
1 _& Q# v1 S! H6 v8 q
' y! g I2 h: s" o7 w0 l7 _6 ?接下来,我们要 编译 这个网络,这个步骤需要给3个参数:6 _" d9 m& T+ Q; @! b* V
* v* I# Q) o$ j. R
损失函数:评价你这网络表现的好不好的函数
a. [9 I8 N9 ]% l4 m1 B1 ?优化器:怎么更新(优化)你这个网络
3 g1 \( W/ _. ^& u训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度& m4 s* a6 x: j8 x" b+ M! t! S
network.compile(loss="categorical_crossentropy",& I- Y" {* v# V- B7 g/ t% m+ L
optimizer='rmsprop',( C& T4 s0 ^1 G- m' o# M) i+ }
metrics=['accuracy'])
: C5 N, {; b4 Z- {- R# C1$ |* X- z; O) P
2& C1 c$ U% H0 `* L! G
3/ n2 i8 s* m4 {$ `! ?. y
预处理
% g" O- S) T& k: O! e# y
4 i2 n1 d1 X3 f. d! N1 {+ T2 n* R% I图形处理
% I+ V. E) T5 d: u$ e- d9 R1 L7 ]0 Y7 m% Q
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。- [5 [4 u! w; F
! F# b! Z, T& g! K" a2 P
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。1 V! Z! {9 L( m
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。' N8 P4 V2 ^% s8 J' {% C9 s
) A( ^! T& w, x& K- l6 E; e# z$ |
train_images = train_images.reshape((60000, 28 * 28))9 p* O3 S) i+ i. p3 q
train_images = train_images.astype('float32') / 255
) ~: V$ t" U0 i6 N0 ~8 y2 P- o- ? M: U: |# e. n
test_images = test_images.reshape((10000, 28 * 28))
7 S9 J, l* M5 Wtest_images = test_images.astype('float32') / 255
, A; P% F \* P }$ I1
/ X' A* U1 ^0 P8 `2* M/ l- q5 @3 A
3
. R( t* y/ h O: V! z" W4
2 D4 I+ Z$ K* i4 _5
/ r" ~1 r' \, x* G标签处理
6 P" F: a6 x" A9 v0 U0 v# u2 h [) @' O; H
同样,标签也是需要处理一下的。8 O4 v, Z% n- ~8 o4 h$ R- M
6 q3 X# f1 L8 b, z- [, G7 b( ~/ o
from tensorflow.keras.utils import to_categorical/ H' V; h+ G. D' U
/ P9 u8 x8 O- H8 {0 P- d2 ttrain_labels = to_categorical(train_labels)" I1 q% _2 P; ?8 k/ Z1 ^& C
test_labels = to_categorical(test_labels)
$ o5 C" j l3 ?2 p+ R1
8 |3 E' B) `9 r9 S& \2! q) c& a u# `9 T& B; n
33 U+ c( _9 r: r* w
43 v) A7 w$ Q) X, ~2 K S! Z* ?
训练网络1 p+ j1 S( I; v$ |- d1 F
8 U9 w- `* E: G% ?, t3 E: I* lnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)) e! O5 T5 ^1 _& Q( n4 i
1& \" D1 g V q! f" d- j
输出:5 t9 V! c+ ^$ ~% @- n
5 e) \: m+ h! x3 Q& J, j) H3 r
Train on 60000 samples
! C2 u& l8 c6 c: Z7 d" \6 U$ M. \& gEpoch 1/5
* w$ E( _6 v q9 D2 Z60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254, \, V" [# r p4 S; K( [
Epoch 2/5$ v) n1 Z3 L2 g. Q! D( p
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693& [) F1 i1 o$ E1 I
Epoch 3/5! | t( J& ]) U
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
L8 r, o9 X" \, {Epoch 4/5/ A" P8 g2 @1 f* s4 a% G
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.98483 b+ z* c3 x D" A- \
Epoch 5/55 J2 N: u( ?+ x5 z$ z* [7 H
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
$ e& w& E8 t+ {3 {) t
* r- a, f7 ~6 \3 G7 F- m9 e- z<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
/ V X( @( N0 Q$ [; V7 \10 N* P+ u3 K$ p6 y1 N( p
2 _( u7 q. w, W5 p7 k: }& ?
3
9 S/ E! O6 h' r, h6 g4
# w! s! D* h$ ^# a; y( t% a1 n0 ]50 S' z, Y4 B2 `* { E& u( l) d: P4 T
67 }+ K1 i& b" }( `$ P
7
0 J! a8 ^/ h0 m/ O0 B86 R# z8 ?( _- `0 }9 l
9
; p4 o+ ^( w: ?2 h10
+ \! ]$ T/ R3 d& c3 ^: x! G/ R5 b11 Y4 Y# ^5 x% G6 Y# {
12
9 K: t5 @- G; o1 x; @3 n135 T$ d4 T p& I$ ?
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
0 }' h& f0 K. @4 n9 C
3 E! g! @0 |6 l+ g再用测试集去试试:
) U# n6 j# ?3 V* V3 n8 Q+ Z! B$ h5 k1 e$ g/ m4 L5 h9 u+ G
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- k4 g0 V1 v/ W
print('test_acc:', test_acc)
6 \# t5 L; X- p1
: a( \! H/ U, G, M- s5 q2 U2
) B8 y: d3 D. ^) i$ t输出:- J' `5 z _- U( `; a5 X
, k( ?: N9 \; j! j
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
; o* Z+ `9 J+ c8 \7 _test_acc: 0.97894 i+ d4 Z! q% D1 G+ B! {' _# ]. @
1; Q8 ~$ f+ Y# e7 |6 }% d
2
4 h* I d4 |& E- A1 I% ~我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。' G" r& Y2 }* W. V1 D
5 A6 o* [$ Q: j. Q. r/ p7 M+ d: E神经网络的数据表示6 ]+ H6 x0 B1 |2 M3 O, B2 s5 H
5 w5 ~) W' c6 r& i. h; D6 k
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
+ ^: Y! A K7 o$ f
/ a5 Q1 A) Q b我们常把「张量的维度」说成「轴」。+ [0 T4 r! z( E, D. G6 K% c- P
y* Y5 V7 F: n [4 ^认识张量
& X1 P: e% A* z% _' }6 \1 Y6 s/ F' x2 \6 X% Z+ w& E2 `
标量 (0D Tensors)
0 E: d: I/ _% x* U! u' T1 T
" z( d1 B/ y+ fScalars,标量是 0 维的张量(0个轴),包含一个数。# y5 R* z# V' D1 G. Q
6 C( |/ x0 a" T( i' ]( Z; N- ]9 s
标量在 numpy 中可以用 float32 或 float64 表示。, @' e4 [5 q. m1 ^- q. J3 Q% c+ {
4 O% F# {- G K5 r8 `import numpy as np- E6 u5 d5 z# k, d# L% C
1 Q% W+ |/ i* q! W9 ?x = np.array(12)
0 O0 s/ {) S7 w* Yx, L# ~0 u7 z% O$ p
10 ? w4 j1 ]) F+ B T
2
" L, |. O5 m/ Y1 C- W& H3 V5 Z3( a0 Y1 K6 J; H5 V
4
* S* L0 c1 T" R5 q输出:$ g9 Q) H; {, y' ^) c- h
; f" f- K& L) \: j4 g: A+ I: Z: N
array(12)
/ [+ X8 R! D6 l# Q1* L4 A" D6 |$ Z4 |! p( A% `
x.ndim # 轴数(维数)
' a% l1 Y8 u9 z10 c/ M7 P: L( N% S! @4 V) [
输出:5 v* {+ R6 E) r+ [, ~2 x, A
. J- B5 j+ S- L3 b1- z. g' o; W0 H% G
1
4 d1 F/ g/ T! j9 I7 v7 A4 e/ Q' A* x! F向量 (1D Tensors)
8 `3 w+ {3 v2 e' x2 `# j0 a7 L& W3 M* C! u) s- J- X
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
6 r8 L, Q; i2 P3 Y/ Z# c4 \
+ g, Y! m& N& [* ~( lx = np.array([1, 2, 3, 4, 5]), v& r R( d/ y: d A9 T& n
x4 l& W* ] p1 Z s
1' X9 E; X( ?- x
2
( J- y4 g7 x$ n1 v, k输出:1 @$ @/ T7 {5 Z
8 @% w3 T" g i! u9 D7 ^3 X
array([1, 2, 3, 4, 5])4 q% d# F" h/ `
1
+ U" `0 B% U( Y5 s1 Gx.ndim7 S/ p/ O- C \$ S! p
1/ ^6 E- x' i. Q, b2 O# `% _0 j; {
输出:1 H; B, c2 k6 t* O) V
. t4 l+ C2 k" w/ X& Y. x2 Q6 ~6 H. q1/ G; ?$ x/ B7 y4 F8 P
19 w; Q/ i5 V7 }7 w
我们把这样有5个元素的向量叫做“5维向量”。
3 _0 x2 j5 D% i9 Z6 f% |- D但注意5D向量可不是5D张量!
6 S+ z! C9 K9 m+ w( l( ]- {$ K
& t" C& _# V w- O8 Z5D向量:只有1个轴,在这个轴上有5个维度。
6 a( l- t5 _3 z4 ?- F7 z6 { z5D张量:有5个轴,在每个轴上可以有任意维度。3 G, {" t" l `# c# `
这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
8 ]8 F/ ^% g. u0 v6 q+ X# I" A- B, ^8 Y. @4 B6 p/ Y5 i t
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。3 L& o" N7 c3 E% \
" ?: G+ S" f, r9 p' H! Z, K; U
矩阵 (2D Tensors). ?% A5 r2 n8 E" K5 \6 J% e6 h6 N! s
) f# g' m( r: N3 P1 G/ D/ l
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
& M# m7 `, _$ i' @6 e, |% x2 l4 D! }, k5 d& Z+ ~2 K
x = np.array([[5, 78, 2, 34, 0],
. i: z5 [+ |: D: q3 E8 J; E [6, 79, 3, 35, 1],% t" S2 e( B, e5 N% J, S
[7, 80, 4, 36, 2]])
3 }. L: O) d) mx
* M8 [) a v4 h0 p& B' E1
1 n) g* ?" B9 }. r: c+ j1 {2, X/ M- B$ ^0 Q$ U* C
31 d3 O4 i/ V# |
4: m: R- ^5 V; G& r" d
输出:
$ x1 M2 W; g+ j3 p! o. X [: I* a. y5 c5 k- m
array([[ 5, 78, 2, 34, 0],' E0 @1 v' ]7 @1 _
[ 6, 79, 3, 35, 1],; D ~: U# T% M( K) {( X* P3 O
[ 7, 80, 4, 36, 2]])
: `6 d. j4 c, l# j! W v1
0 X1 |% K0 R' @& a0 X: l# D2. H" @/ O- z2 p4 K
3) d& e8 }' Q0 G- Q7 B* X
x.ndim
3 l! g( q9 y2 n$ ]) p1/ e2 b2 e3 m, j% d5 Q9 X
输出:/ y7 ~* J) Z v( s6 k
% n, l4 G v. K) S$ a# E2
: _% S. x H4 g2 e# \1- `8 ^# D1 j5 B; y1 a* A
高阶张量
+ E9 {( }: g- n) e3 e
/ F. W& x, E q2 V6 S7 [& O& A你搞个装矩阵的 array 就得到了3阶张量。
2 D! c, J7 {) a* n2 ]1 v- {/ N0 N+ ]+ H2 V/ b4 N$ H) P
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
8 r4 `- N# j% K3 ~' |3 r/ J0 Z7 l, T+ H
x = np.array([[[5, 78, 2, 34, 0], G0 X1 O, \$ ]) `4 u2 p, p4 x; i6 Z
[6, 79, 3, 35, 1]," D7 I5 j; c. b; S! z0 l* U
[7, 80, 4, 36, 2]],
7 H' q8 k. s* y0 L [[5, 78, 2, 34, 0],
7 I* ]9 ?) x- {; Z8 k5 @: f [6, 79, 3, 35, 1],4 r1 H" Y: ]3 n# ]1 V
[7, 80, 4, 36, 2]],' ?* H" ^+ C+ ~
[[5, 78, 2, 34, 0],! L2 _3 H0 _; G& e; p& b
[6, 79, 3, 35, 1],, ~0 l) g: @/ F6 h& t) [! Z1 m
[7, 80, 4, 36, 2]]])
0 M; j$ j; y& D3 t4 I3 K, q$ S4 Wx.ndim
. @" \' ^7 w8 [4 ]1& Z, q U$ j9 S2 P1 R$ P
2
3 }8 {! ~5 x% Z3
8 D8 z- n9 ]* Z! @) I4
8 ~) F1 h( n) |; X# j* K7 W51 r4 [3 O. x; v6 i# y. k
6
3 a, f# |0 [; ^0 |6 ?' R- _! |8 J& i. Z7
+ H2 _" a0 G/ \& t* N) f5 S8/ r: z: t) S; [; e
96 Y5 {0 y. }- h2 k3 P1 e
10
$ Y" ^1 _. T; P* c输出:
r$ G" e. a! r$ |
5 @" B7 U, _/ d# N# I& n" e( P" X0 t3+ X/ e" Z) p* b. q( r
1" O0 p% T& W; J! U
深度学习里,我们一般就用0~4阶的张量。
& \+ ?2 h O- ~! U7 n) C2 q9 D. \5 U. t C m- J
张量的三要素6 V7 S* ^4 ] ]3 c# t, a
+ x) f# B. }1 d阶数(轴的个数):3,5,…
3 f9 r. q7 m" \, K, C) I( T形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
/ D1 Z' Z$ }. l; Y+ n" \, s数据类型:float32,uint8,…
4 c" g3 Q5 g4 G5 Y# ?; m我们来看看 MNIST 里的张量数据:5 x1 W f" D. |- H0 L/ t9 Q
% R- W/ h6 T3 k8 ^from tensorflow.keras.datasets import mnist
" g! z" ?6 j6 z7 q' V(train_images, train_labels), (test_images, test_labels) = mnist.load_data()0 ^) Q. p: T. E" r8 Y0 q3 i: }7 ~
, j" N* f" H$ i+ P! z0 V* F$ {+ cprint(train_images.ndim)! ?. `1 h6 y( V- k2 [5 y
print(train_images.shape)2 L& V' ]% E" g& l; h2 `: x
print(train_images.dtype)
( {. b# P9 u. R5 N# t17 R% y2 ~7 Z; l/ E; C, z
2
, x" C7 x7 m" w: q$ ^( j% B35 @/ g9 W9 {, D% Q, Z/ g" W
4( B4 f; g8 {+ _6 p1 Y
5
" v8 a. s8 j5 D6
h; W& j$ [; X输出:
; P8 f5 U) d8 G" }
D% m) m) J4 b# c3
! w; ^2 U1 C. r' o(60000, 28, 28)* r, I0 b3 R1 q1 w8 d& _ l
uint8- C9 y; c: s; v. R$ s8 s- x N
15 h* a: F0 f% T6 ]
2: Y0 W+ e J; S/ M) C) @
3
; T6 {5 }: J! z& D. b- p# W所以 train_images 是个8位无符号整数的3阶张量。
' N4 I; \ s4 ~, r4 p
) |1 K- [3 N' ~; Y; w4 X; \) |: O打印个里面的图片看看:$ R; _* a9 c+ D6 ^* x. n% L
}% b C: z0 t: v" G) E
digit = train_images[0]3 ^, Z2 U' N; q: B
1 K; \" @( A" }, @
import matplotlib.pyplot as plt
' L1 j3 |: Z) e G3 I# k& U9 Q+ `# ?) b/ ]8 J' s( W
print("image:")( q5 K0 k9 W+ t" R7 O: z
plt.imshow(digit, cmap=plt.cm.binary)" A" S/ @/ @6 [" o: m
plt.show(); `1 w, ~& w' h3 z, `9 t; O
print("label: ", train_labels[0])
. } T# D/ G3 ^5 v$ ^/ n( q0 R1
) q" `, V- s" u: m ~2 z2& f& ~9 V, Y m7 U! o( v O
3+ X/ ]6 ~/ ]' s2 n( `
4' S6 [: R6 _ v, C2 w+ L
5
! U9 o0 {; o: k+ b. K; n! ~6' y$ u+ ~# @8 R" G! c* G r' H
70 x" a( n- [ z" O A( _: E: R2 a
8
5 E9 d, ~+ J2 o/ @6 c# o/ x! f: y输出:0 u9 U+ v# o; b) Z2 G
( \9 {0 ?; w) c
. ?# ]: q* ]/ R' u f
+ J$ I$ O( v. F+ M4 l% H
label: 56 O- \5 [5 {! }+ O+ s- s+ Z) G
1# |) U- y& f: M
Numpy张量操作
1 L; W- L- S1 u* c/ f
; J7 [$ i2 L8 Q! m) ]1 ]7 h# y4 n张量切片:+ F- |, U( Q. @- M4 F' A, J
' B+ u& P. W1 ^
my_slice = train_images[10:100] _; N$ y/ U8 w g" ]. f
print(my_slice.shape)/ }, k: v( N% y0 w' @ G
15 L; I4 y+ m5 _1 l
2$ n9 x' \$ o/ w9 C9 O+ O9 t
输出:
' v7 E+ ~. z% w$ l
+ j% D/ F T( E/ ]# ^* M! F(90, 28, 28); L* [9 Q7 O: E! C3 a# @- s
1
9 L# A$ P1 c+ _7 ?. b; i& Q等价于:
/ Z1 I! a: M, J7 ~! Z5 a( h
: Q( g" o: [& h1 x" f4 ]$ nmy_slice = train_images[10:100, :, :]; @2 o. O5 u- h1 B- ^. n5 U
print(my_slice.shape)
% R" `- M6 Q6 t+ P14 R0 P! c2 W- s, N
22 O$ N, M6 B6 J' C9 {- f) `; h
输出: n1 u0 H, @; R2 e8 u* M5 h' V
3 s8 A5 a6 {& f" [9 B
(90, 28, 28)7 z& z' o8 l( ?9 O: q8 x
1
$ [# d( {. M- P, q/ Q$ h9 B: t! v1 ~也等价于
8 ^* g; n& G2 q$ x ?
! l4 T6 _" e hmy_slice = train_images[10:100, 0:28, 0:28]9 D. E2 X3 D! W6 B+ a
print(my_slice.shape)) @" s3 D8 F) A8 c# b
1
8 U$ Z7 s9 s/ O! g5 u3 R" ]2% R: g9 S& q9 S. f
输出:5 L; k% J/ p F( L Z9 L
7 E+ H, ?8 |8 F(90, 28, 28): m) z! c, f- W
1
j; O$ t1 `! I选出 右下角 14x14 的:/ g+ }4 \8 D& T# z4 q6 ?! m' i
2 Z1 T u7 R9 f: ^- Y( {my_slice = train_images[:, 14:, 14:]
) l3 s# z1 K3 ?plt.imshow(my_slice[0], cmap=plt.cm.binary)
6 b$ Q& L a3 Qplt.show()
: ^1 U: s/ ?. e- @/ h1
5 [% D" Y7 d5 c, r+ V2( }- N V) |1 |: ]4 Q/ ^. g
3+ ]: |, Q! F7 J
输出:& e' j1 t- t8 w/ ^: m$ O! q" ^
; W' Q* }! v' z0 `: ~
! ?+ `, w9 v# G
3 d9 Z0 h4 V, Y5 g5 P" C选出 中心处 14x14 的:2 L6 W0 q) _; H! ~$ [2 u
" G* v7 }/ S. R* O# ^- {
my_slice = train_images[:, 7:-7, 7:-7]
/ S$ J+ X+ ~! F8 w' @plt.imshow(my_slice[0], cmap=plt.cm.binary), N; A4 l" L, t2 g* F
plt.show()
3 C# n4 A6 u4 h1 [5 v1 i4 x* w6 A1
) R2 P( K$ c9 k# K1 ?2
/ G( I x4 s% o, q; r+ A3; M. Y" h. A$ w: I* r2 l/ s' I) S
输出:
. I1 P% _8 l# g
4 R d/ @' h0 O- H1 l+ a0 T! W- K# q5 q2 f8 A2 L1 {
2 q/ v$ ? N4 W3 M: F
数据批量
% L5 R$ V0 `% E: y6 y: X/ ]4 A# n0 ~$ H. i/ W
深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。2 C0 r! Z. V/ Z. x9 G g# X- O4 }7 o
0 x' S/ l P) J M4 H2 ^
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。0 A- g3 }# U& v2 I
* L6 m3 i- X3 g, Z; m在 MNIST 中,我们的一个批量是 128 个数据:
9 }0 M" P0 `8 R& j4 F) D- R6 C/ O, W1 P
# 第一批1 i1 g+ W$ C2 S9 u
batch = train_images[:128]
3 \* K, D' C6 l1 |1 ]2 g8 L# 第二批9 a8 D8 ~$ l* X6 F
batch = train_images[128:256]
4 `, `7 P" W) m6 Y0 h# 第n批9 I0 k: `$ _, o" E4 {+ O
n = 12
, b+ t. N4 s4 V( q0 L* O& N+ C: J3 Ebatch = train_images[128 * n : 128 * (n+1)]
' a5 {# G/ h$ Y1 D6 U1
3 ~) c/ l- v: L5 N0 q- e: Q2
" Q. g, J" I) @4 {, |. Z) s3: e2 U3 T& o) T3 R! A" @
4
% u4 E J5 b. x; d- _4 m5
7 o$ O U9 h; j# `; v" F$ K3 L) B6
8 `7 t+ b; K+ }7
% V! f6 x2 z3 [所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。1 t6 B3 p4 |- s" Z( Y ~" i, _
! `# K" _: C, i
常见数据张量表示3 ]& ?( J/ ]( F6 g
% O4 N6 p/ U: {+ v
数据
' R2 j; f$ D! y2 `3 v v |
zan
|