- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 559100 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173103
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
$ \. b m/ J3 O$ WPython深度学习之初窥神经网络
8 N& W- ~8 O" l( M本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
: ]% E$ M4 t" k' S" ^
& F( t) o( U* d" I B( m0 c7 q本文目录:
+ o5 p) S8 x& p" R' V/ e: r- l9 R1 Z
文章目录
, _5 Y9 X. q3 O4 P& x
4 Q3 ~/ N$ p, Z9 z6 b6 @Deep Learning with Python
( r9 @; F8 ~9 W初窥神经网络
. Z9 n3 N& ?, n; \1 ~4 }) Q导入MNIST数据集' R) U- a% K8 A9 G0 f
网络构建
* X2 @3 R) b' J% B3 l9 P: r编译
' j+ n. Q) X$ }, h6 @预处理. h' m, J" `/ Z, D, M# J/ s) u6 H
图形处理3 x6 M( A0 j" J# Z4 O$ F/ Q: D; d
标签处理
- P* Y5 c+ g% n4 \% q7 i训练网络1 n+ r3 ~- o. ]; g
神经网络的数据表示
* t8 |* | B, `5 a6 f3 G认识张量
- j- R3 R; g9 ^7 N9 N标量 (0D Tensors) A" Z1 J, q( f# `( N3 W( e
向量 (1D Tensors)
( T) h7 W: B$ Y4 C. y6 t( V2 W矩阵 (2D Tensors)& e4 r# l3 p8 s( t. q
高阶张量5 ]0 s' h% C7 h7 \3 `
张量的三要素
4 g, C- | q! Y& t, o$ rNumpy张量操作6 E1 c, |4 s2 Q8 R
张量切片:
/ B+ I( N( P0 b数据批量
3 s8 h9 S A7 z% G6 i+ Z( w/ ^常见数据张量表示
4 K+ O* M4 }& r! ^& p神经网络的“齿轮”: 张量运算
" R- Y0 N9 F% x: \逐元素操作(Element-wise)" Y, F- W) h$ [8 `0 L) Q
广播(Broadcasting)
# b2 H2 v5 _% x( k张量点积(dot)
4 [& C. O7 R( o, ]张量变形(reshaping)
+ {& M% B0 g, G' k! G0 h& n6 K神经网络的“引擎”: 基于梯度的优化
2 K# M& i, T/ ?. A6 q+ |1 k导数(derivative)0 X% N/ ]2 ~, N8 s4 H" f
梯度(gradient). Z7 ?7 I) D+ W# ]
随机梯度下降(Stochastic gradient descent)
; x" p1 K! F4 S: P3 P: ?反向传播算法:链式求导& L+ C$ Y: E/ g. N: Z
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
9 y( p: Z+ l$ ^: @! f- V5 Z( d7 Z7 o1 a' E
初窥神经网络
7 q1 f( S2 G i+ D0 w; K; \: T! z+ s" Y6 \& j4 c
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。 C2 S( z* @, V$ E' }" u
" J e; V; k7 [1 ~& OMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。5 v. I% q1 R" V, m) m4 W. v
5 f3 \: u2 v% \5 P, F+ C导入MNIST数据集
. R8 Z3 f3 }+ M: e8 `
4 ?( |- j r. J/ f* K" R$ b# Loading the MNIST dataset in Keras! K" h, O4 ^& o- G2 ]! c. u
from tensorflow.keras.datasets import mnist& o O* d5 M0 m2 F* Z$ I
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
5 Y: Z4 h' @! @) y3 i1
9 X- e/ |% ^8 P2
! ` n. D( [7 P D0 N, D31 X1 d/ X( C9 H' w! E" T6 N
看一下训练集:
: T2 s2 I F) M. [( f9 S3 J; S- l5 \; a+ D# Z
print(train_images.shape)
/ |+ g1 X8 p& e3 pprint(train_labels.shape)
4 j! s9 j# X; C; g$ Ytrain_labels
' N" s3 Z% k: ~9 T1# c$ _% _ U% I' Z( ?: f
2
( V3 l, d# }' [& w8 Q: b3
' n. N2 i/ v1 B2 S7 j6 W输出:
2 L* H1 }3 Z/ W% b1 P6 s( ]1 S4 | f) z5 u8 J! @1 @" Q
(60000, 28, 28)
& V. ~2 N5 a" ~2 }2 `(60000,)& t N; q0 B! V3 u) }7 X
& N2 I: @8 B1 m f1 {! W- Qarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)$ g- I O; R: _, N: _5 I: e
17 V5 o$ a. ?# Q, t# k
20 ]0 P7 _3 t3 B2 x" X+ p' c% N' z
3
' k* Q6 Z; J# [' \4 y! b1 G$ [. E4
5 k U1 O5 ?- ]5 l( r这是测试集:
! s8 ?1 L1 P. t/ m
3 X% E( y* _- j0 R& Q, z* _' wprint(test_images.shape)/ ]8 s5 T" ]) N
print(test_labels.shape)
6 v, J& D( v" p6 @( t( e5 Ftest_labels
% q* {! u) S/ R' t) [( n) c1 I1
5 ~4 Y6 ~8 w# X& L2% x( H% X( {+ E( [( Y
3+ g. ?, ?- \ w6 U7 s
输出:- u6 `% j5 [4 ^9 ]# a9 `
4 D$ F+ @5 C; B" n3 u
(10000, 28, 28)5 M( S$ C7 d8 F
(10000,)1 Q( G- M+ B Y$ t' T
" R& E+ S, W% `% h7 B
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)9 ~! f/ j ~7 d3 n3 H
1. s/ [: Z' ^* Z& G* A
27 h$ G; b5 h5 u% V$ K2 M
3
* c6 Z6 G1 w- C5 Q, L% ?9 G" b43 D1 Z. l$ F) l2 k5 q
网络构建( M& z2 r% `3 a3 i. e3 }
% r3 {- y, j- D$ C8 ]+ O, R
我们来构建一个用来学习 MNIST 集的神经网络:0 t# q* b2 O2 b9 R/ G9 e# I
# D( R/ q8 y- X& n8 e( F+ |
from tensorflow.keras import models
2 j) I' c) N4 g2 Bfrom tensorflow.keras import layers
9 o& A! R% o, v: ^$ b6 J, P7 ]% a9 u* b# H
network = models.Sequential()
8 {1 R$ _9 b# r2 hnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))' j% B( a6 y/ m6 `$ j$ b8 \0 t
network.add(layers.Dense(10, activation='softmax'))
- ~3 @ M( X) e1) l9 n1 ~: H: A
2
6 r$ T* s2 e1 |6 Q; B3
( _7 ~' ?" g+ H2 q j+ [47 k$ b+ A) }2 }2 n9 P% n
5
: f7 R* o, O% H6* C7 B$ x/ s: s" J
神经网络是一个个「层」组成的。
% n. ?1 I5 I+ p! K b/ k5 e6 L0 ?一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。/ _# n9 h2 L4 A: S6 N
z2 L+ I/ ~1 M
这样一系列的「层」组合起来,像流水线一样对数据进行处理。
+ W) b; e# R5 q0 ~- q' I e4 j) v; q层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。+ N- v, e7 F( j4 h
7 g: t. x& W: p Q3 M我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
9 E7 [* m9 E5 J0 K% V3 r3 ` F. l' v* r/ }% W+ {4 Z
数据到了最后一层(第二层),是一个 10路 的 softmax 层。$ V5 C$ w# H# c" H# D8 |* `
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
9 s& }- y! c/ a& \7 j# o, k& {事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!8 e0 n* V4 i% L) P, ~+ J* \( Z( Q
7 Z) v4 \8 N4 {) k& W: p+ ]编译
+ ?" h! i0 Q5 L3 }8 S1 \7 R9 [5 y7 p' M% a
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:) X* C a+ k6 ^6 O9 F! c9 L# S6 U
O0 [" N, u$ ]' y0 A
损失函数:评价你这网络表现的好不好的函数* i% }8 Y; t- e3 b* a) O, e
优化器:怎么更新(优化)你这个网络
7 M& R7 A7 D% v2 h7 ^. q' u训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
2 L$ p$ y9 s) t( |, U1 ^$ `network.compile(loss="categorical_crossentropy",
+ ` j2 a5 i; o% E7 N0 @2 n optimizer='rmsprop', x) F+ k! ?: q) h
metrics=['accuracy'])* P" a7 j% v. P8 d2 K
1
/ J, q! Z' e2 Q+ u2, ?7 {7 J& E5 I. ~9 w+ p
3
0 L' n! E4 d/ o. }' i5 R C预处理
1 c6 ?2 m6 O: m* C
/ G2 Z6 c' V0 {4 y. `图形处理) a6 D8 d8 { R u
k% f0 g' N) V: d
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。$ S! J1 D& t, ^$ u1 ~# `1 x
, @" `2 ~ f, I) |7 fMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
! ?* G: N5 _. W& \! A5 v7 j) F而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。1 {4 {( }. [& a7 G
( p; w2 i# {" ?3 [& g
train_images = train_images.reshape((60000, 28 * 28))
4 K) f$ y; ?' t$ L9 u. J* ftrain_images = train_images.astype('float32') / 255
1 R+ z6 B4 L: S$ m: C" C7 x
4 Z* M% r* y2 X R% `test_images = test_images.reshape((10000, 28 * 28)). t* B( H: S" N% N1 M f4 w
test_images = test_images.astype('float32') / 255$ n6 G9 m8 J; ~1 w& C* K# w
1
0 o G- l7 x0 N5 t; b& v26 f% v0 D6 A# d5 ]9 G! U. G8 m
3
]- c1 _ f7 \. m4- Y0 p8 F% Z c) W8 o+ B
5& c$ R! p, C a3 i" t* n1 Q0 X4 K
标签处理: b+ H4 S3 M* z9 n2 U) ^/ |/ q- \
- D& C3 @; H* g( J7 d
同样,标签也是需要处理一下的。+ R n& E+ v- o6 |* M: S4 K
& V1 O/ j4 B6 [% i1 |from tensorflow.keras.utils import to_categorical
* p3 K/ J0 h) K+ D! i9 {6 _8 f
- [9 t: v! ^2 x* `train_labels = to_categorical(train_labels)7 l. e8 }0 D9 f7 d. ^. Z1 V
test_labels = to_categorical(test_labels)" z" |& C( R% c% n3 w. m A. c- x
1 n: `, q% L* f
24 O2 W# c2 i9 f2 @+ J$ O, R: A
3 `+ B/ P4 `. f# [% O/ A
4
0 v3 g8 d5 q5 Q$ z训练网络
# }! g- v6 O5 k: s6 v
. Q" \. y+ |3 Y% z: Znetwork.fit(train_images, train_labels, epochs=5, batch_size=128)# d A$ c5 u$ q& B z( f/ [
1
* e6 Y# s$ B! F' C' y输出:
1 E, y9 I1 f, e' m* y" E: y, G( e& w5 q8 b$ U
Train on 60000 samples. c; \- L) \ ]) ~# Z- N: V, }6 g9 y
Epoch 1/59 P8 j8 F1 v& s" B9 X' C/ V8 u
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254' a3 w7 Q( t R+ `: u1 f, u
Epoch 2/53 U1 f1 H2 J$ A. ]" l" P" [
60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693& n! ]6 p) Y' v- U0 x/ v4 U
Epoch 3/5
* v+ f* t* l& P4 C2 T7 A60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800- h0 x- [1 {8 |
Epoch 4/5) b4 ]: N9 g9 l# e I( z; X5 h
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.98483 i- Y1 T( }' ]. _$ R
Epoch 5/5
0 U: W# B9 B! j/ b) d60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888+ b; }, R+ o& U/ F/ \
- p4 S0 g- j+ f
<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
/ S3 F6 K3 m3 Q, ~, l' P" i$ X" ?, b1
: |& k( d: O* K; P/ ^, \2
) H8 E1 G% X' }+ V/ p3
! k) ?, ]# v2 d9 C4
P1 u( M7 u' b* R- F5' O9 X5 `) S8 z H
6# k q$ \6 D6 O( r
7
$ o3 G( v/ _7 Q5 v$ C6 T3 g- P. T; C8
, Q3 R h) n3 z3 v9
" H, w0 M4 v$ z( P& a! T8 K0 j' a10
8 f0 m+ P# l0 X115 C# Y$ f1 [9 g- q3 k1 l
12
8 \ k$ E9 I( ^2 ^6 R& z13
8 k, h( m; I o- C, X% a可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。; z7 v3 S1 i8 |: r0 m7 U o" _ v2 G
. ?9 X* a1 ^% b X" b' w% D
再用测试集去试试:
$ h. W6 m; d+ l- b7 {2 |9 R; Z" o0 R; R+ P0 X7 @" O; z( ^* ~
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/322861 }4 D2 D1 K5 O; [
print('test_acc:', test_acc). s$ K$ E( @7 n9 f- k( |) i9 @
1: t2 }- @2 m0 x
2* K) V5 i) Q5 Q7 m* c- i9 c
输出:
% ?. F! W- z ?: c! O' y! B' w, M$ |% x) ^7 |7 ?& g# m3 O# L; |
10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
& {' f# g% c7 Ctest_acc: 0.9789
1 F& `5 q1 e$ T5 k0 I& w- N16 [+ n$ O$ o1 I, ^3 u* W# b
2
* z3 D1 C; t$ _5 y. i我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。; k9 x+ v* G8 B/ L6 _
% p- G7 t- W3 r. R! N神经网络的数据表示- J/ D) j# m, O# h2 g
, w2 I. T! O0 A$ O# U- R
Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
( X( C5 h+ ?! F/ p4 l6 D! J A6 E3 V( {( Q# x8 k( d% K
我们常把「张量的维度」说成「轴」。
+ w" F9 q1 w& f" _' W* V; v: G0 p3 h
4 B9 J% @9 g& {# B# w; G认识张量 Q) h* @/ `8 p4 X( z
1 F# Y6 m) K" h* N标量 (0D Tensors)3 T+ \" S% W# Z. C. ]! i+ p. M2 G
: [. f& Q" R" tScalars,标量是 0 维的张量(0个轴),包含一个数。0 R, i( V- Y4 P9 ~& q2 D( ?
" n" h0 f! }" T4 C6 u F# T! |7 T
标量在 numpy 中可以用 float32 或 float64 表示。1 r ~* x3 t n& B0 o3 D
1 s0 }* d% O$ y B$ ]; `6 y4 i- W# j4 _2 t
import numpy as np
' n1 f, w0 }4 ^& L4 v0 a; T
7 R! ~ t6 f8 V/ F2 P( s4 Fx = np.array(12)
7 n) e1 F9 B V1 w8 C! \8 `x
# u! J( \+ ]. W# D) N, M1
5 o3 Q' b& Y4 {9 s! j; G2
. q! l+ N- C& M& Y# N" w0 e0 b8 d3
, L7 h* Z$ k8 G8 B9 M4
5 s* }2 H6 q: n5 g5 `0 g3 Y输出:8 ^8 r8 G/ q4 O( s& |
& R1 |/ e- n) v- ^$ X6 H3 Harray(12): ^2 f! |" {! Y- O4 M3 d
1
% q3 R8 V) A8 x, V: D5 ^x.ndim # 轴数(维数)
A( u8 h$ P1 j$ d* G5 t" Q+ P1
0 v, O$ `3 K8 b8 K! q) ~输出:
) z5 L' _) _! Q9 x. J% l$ T: b% R, V# I, t1 W8 c; V
1
1 E! w7 d( A) V+ J( \5 B1+ H: D! k9 {: ?; D
向量 (1D Tensors)
3 Z2 G. h& n7 ~9 w6 [. Q; I9 X {4 k, f' I7 O/ U
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。4 W& V N7 E/ ^ O+ ~& P- Z, Y0 f# o2 W
|5 a# A( a4 o5 n$ @, p! Kx = np.array([1, 2, 3, 4, 5])8 | `# e# ~7 @! c+ T P* b5 d2 {: a
x" g) Q( Z( S M- f" Z$ Y
1
8 e; @+ E3 b' v @, O2
s; H- l2 C2 o: M) e输出:
1 M/ g: s$ t% E
; }: E# N8 ]5 {array([1, 2, 3, 4, 5])
4 f/ F; ~: Z& {17 j q; X( C/ P( ]" P2 C# u
x.ndim
" Z; J5 u' p% p+ y6 X+ M. ^1
1 q- i; o. ]7 b e( u: d/ y' T输出:7 A3 Q: G$ ~: Z: A1 O* t: x! {
+ H' B8 [2 a8 v' s T$ d
1
" N2 ?: @+ H k1
& h4 v" H: e( N) t我们把这样有5个元素的向量叫做“5维向量”。) O2 `0 V2 W3 ?% j
但注意5D向量可不是5D张量!
6 U4 V8 a# V) ~# ]8 ~/ h0 E
" w) e, U1 m0 u# B5D向量:只有1个轴,在这个轴上有5个维度。- {4 Q( `+ D E& [) p0 w
5D张量:有5个轴,在每个轴上可以有任意维度。
7 b0 ^+ ? |" e5 \+ j: H7 e这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。7 S O. ~1 @% b5 I- X0 ~; ? a) J$ R
1 Z' W( K0 U4 C! o
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。% K9 C t0 N( H+ r9 i* G9 c
# m% [/ a1 b' @6 C0 q1 E( E矩阵 (2D Tensors)) I# W3 \- {3 f/ H2 D7 S1 Q0 d1 g- l
* [! l/ G0 S: X' G- L6 KMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
: n& y* K! F' T0 n% m1 v! S9 |2 U" B
4 E: m4 Q! `+ g; Z7 `# X+ ]3 P0 Y7 ax = np.array([[5, 78, 2, 34, 0],( W: O& A! T$ p8 Q
[6, 79, 3, 35, 1],
7 c0 q7 q$ }" T ` [7, 80, 4, 36, 2]])# j( G3 e+ Q! p& y
x+ {- r- r0 y, W6 n$ P
1
! S& v- s$ c7 D" \* b/ P# i2& j7 J6 T* Z! p6 V0 `" b1 h( F( ^
3
9 E, ?- {, [- N3 X. v; t* m4
0 r2 \' m f$ s( Y输出:5 }+ \/ n% d9 O4 O9 t% x5 r
, b& ~- n H/ ^' h# e. x0 p7 r p
array([[ 5, 78, 2, 34, 0],
" @3 C" i3 S, y* l9 \4 ]% ] [ 6, 79, 3, 35, 1],! a5 C u' ^5 Y, V
[ 7, 80, 4, 36, 2]]): Y# T& Z7 K# Q/ R0 N+ z- _
1- P% e# V0 I2 b# ?( M6 k6 P
2
3 U4 L" P1 y0 S+ [3' q: e- N3 O: p, `( a/ m- X
x.ndim
7 u# \' G* l) P9 }1# ]' {0 @. J- T
输出:, A0 M- R2 f6 ^+ J
/ }+ c" g& y+ N$ V. i' M) W) F* |
2# w% N- H, D! N: o o7 g/ ~3 B
13 E; w x. i" c. ]6 X/ y @2 j& j
高阶张量0 U: P4 N9 K! K( y2 t" |# D9 P* {/ M
, O5 c* t& s5 m6 b+ m( D你搞个装矩阵的 array 就得到了3阶张量。! i2 u8 ^- `- ~1 X" w
8 h. Y. {; l" ]& d
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。+ v9 \) J+ i4 P
- ?6 Q; O4 ~' M) b
x = np.array([[[5, 78, 2, 34, 0],
& K6 \( z: U& i. ]3 m+ Z5 [6 S [6, 79, 3, 35, 1],7 m. O i/ E7 L" D" h+ _$ w- V! E) b2 K
[7, 80, 4, 36, 2]],
+ A$ w+ z2 }; o: i' N0 g+ [8 y& W [[5, 78, 2, 34, 0],7 w# J, |4 Y7 e: h
[6, 79, 3, 35, 1],
; z7 @# q8 Z( C0 o! }$ f9 h2 _ [7, 80, 4, 36, 2]],
3 @$ w; i. q, g' q( R' F, x" ^ [[5, 78, 2, 34, 0],; @ Q2 |9 m2 {7 M
[6, 79, 3, 35, 1],
5 E1 j# i) d) o( F8 _; K& j' o( D [7, 80, 4, 36, 2]]])
2 O. B& B: h0 b1 @& x+ mx.ndim! d: m' b* c2 U( M
1
( O% b1 t: Q! \# M5 E( o1 ~1 I T1 g20 O w9 u9 R% F% n
3( F7 F3 k: L( v1 V' T
4
/ w# @6 O5 C# T5
( ]# b9 `: G) V5 a, a' V7 S6
- R( c" J4 h- V7
# R; }0 B0 {4 C* p) @8, m7 `; [" D! {$ b3 }
9
~0 E; J( J$ q, B5 y2 U' S10
6 _2 s9 s. L+ a3 A+ a( G输出:8 j3 J: X5 Q4 o3 E; o
1 ?$ U+ i+ K4 }! Z3 n) F$ S( n K
1- G) a0 R; t. @. R8 m
深度学习里,我们一般就用0~4阶的张量。
6 p+ L/ w; t( Q4 p6 k2 d
3 \; `1 v9 b1 h张量的三要素
/ c* Y- }% A4 `2 `3 i
8 Y& V6 I/ j0 E5 e7 X0 G阶数(轴的个数):3,5,…3 B$ }/ _1 E T/ [, p( K
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…, L @0 n" i d- K& q0 [: c
数据类型:float32,uint8,…1 q- o! ? z% L
我们来看看 MNIST 里的张量数据:
# z! Z% Z, M ^$ e4 s& f3 t7 H5 ]
from tensorflow.keras.datasets import mnist1 f) ~9 }. H" m9 }4 L
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
' J- A* v+ ]$ B* \" ^7 m& d
8 Q6 ~2 Q9 U5 \print(train_images.ndim); @! C: `4 m7 Q6 {- ^# A7 s0 O
print(train_images.shape)* O( h$ {; r6 C' w
print(train_images.dtype)
9 K& a D7 p Q6 ^% N0 X/ M$ S15 X4 R$ o; l, Z; y9 M
20 E$ m( l1 V7 w; |9 R& X
3
~% {/ `2 w5 K4 _; q4
0 l, D" R2 ^6 ^, b8 R; u. H5
; n+ {2 E5 t# k- u6
, ?, I1 s5 y' C7 `1 p( |. {输出:/ O# j l7 g! `
& R7 G: B, c. K) k9 s; ^/ k35 K% o$ s; g+ \& z
(60000, 28, 28)$ ~* G+ M2 S( @+ m+ c
uint8: a' @8 {3 }8 i5 y: x, Q6 ~
19 C: N3 f2 t1 J+ b7 k- `, u* S; Q; v
2; l0 E, O0 v5 q* r& |
3$ C: b9 v: x n. e' x
所以 train_images 是个8位无符号整数的3阶张量。
5 h" B/ O0 ?* U5 z* w; V: D) p6 _5 g" L- t
打印个里面的图片看看:0 T! g/ T$ X) d0 E
5 f; v6 g8 n4 e* N
digit = train_images[0]
' T" Y! @! ?$ s4 E; |" i0 n) R6 _5 i3 j; Z0 b6 U4 d
import matplotlib.pyplot as plt
) t( D9 t4 R2 s; q9 I1 J
, F7 D* P6 e( O* w6 Qprint("image:")- h6 R- F. @/ D+ ?% b) x4 R
plt.imshow(digit, cmap=plt.cm.binary)/ q8 f. f9 c) L$ S4 X
plt.show()2 C) d9 B0 j1 z3 ` P1 z/ O
print("label: ", train_labels[0])7 ^1 \9 ^1 h3 `$ X( Q
1
& U6 A% u- t+ f F7 s% d2$ D$ D# g$ u {; X
3$ _7 |7 ]) @8 T9 a8 w
4* X0 T* J6 \$ k, C; B
57 x2 ^, o' R- v8 L4 M
6 Z; l+ T# E ^1 i) M/ H- K) \3 @
7 y9 F) v9 i% |
8
! H( \& e& ~# b9 o输出:
9 U& D. x% |# m6 n/ ~0 F
: Z& ]: \/ W7 _+ X" C5 W9 G( ?
( k! S; k% d+ p3 Q4 e6 t2 z4 t; X5 r" U/ }; ^ ?+ M, M$ v, Z
label: 5
& | E) T; z3 L12 P' w( E$ W1 d
Numpy张量操作
v. V: ?0 Q( C( [4 ]# s9 U6 p& n+ `, e7 h. u+ f7 E! W( F
张量切片:
9 f* @ g/ K: F+ E5 m! l) Y7 `1 N3 X' p9 j! ]# S8 O% W% O$ o
my_slice = train_images[10:100]
1 m/ J: p* }# D. N4 J) t; Gprint(my_slice.shape)+ K; m6 N7 |0 `6 i; p( y
1
- {/ ?% \0 K2 Y) Z' N. k2
# h$ S3 [1 s% g- w2 O2 o) d( ?; Y输出:3 J* D( x r: }+ S9 _
6 V" i0 ~5 }+ ?8 H! p(90, 28, 28)
6 V4 ~+ T8 p. H1' q! \0 ?* I) {8 A( J) Y
等价于:
( O9 o: {7 i# e0 @( K/ e
3 L4 z* R+ ?3 k7 ?8 qmy_slice = train_images[10:100, :, :]
: j/ O" F( h6 M/ `* [print(my_slice.shape), k/ q7 z8 ]+ _* X
1
* |- q; @& r$ I4 x- g0 k5 ^2
: B0 T6 \' p- D& a7 r4 H输出:
% S4 J2 r# ? e% T8 @
4 {, G6 d. O) N+ j(90, 28, 28)
) U- v0 l! T# b4 I" y. a2 }1
6 u' V4 F! }, ]5 v也等价于
/ ~, f5 K4 I+ e# O; S5 r9 z- K
1 ~& _) P j" i- v: S3 qmy_slice = train_images[10:100, 0:28, 0:28]5 d& F( w# T8 m$ R, Q1 K7 U
print(my_slice.shape)6 P' d4 L3 w, L/ k' ^( @$ P4 H
17 a6 _( T* q" B7 V
2
4 B# u- `5 C0 m5 x' s- c ~输出:
/ d: y! ]6 K- c n8 u$ ^+ s, e& _! e& g2 n/ A( J8 F5 C3 k Y* q
(90, 28, 28)
" X8 N% ^' i; L5 f1& f# q0 m) n# t" Q& q# K/ n
选出 右下角 14x14 的:( d: ]9 y0 p" o; Z7 s
' u" P0 Z. P3 ?$ m; e! M5 ^
my_slice = train_images[:, 14:, 14:]. R4 S6 d$ H7 I5 @8 V1 K" S7 n
plt.imshow(my_slice[0], cmap=plt.cm.binary), H% i& z* ~: a
plt.show()
6 [( H! X& g2 U5 H* j$ h1
+ R" ~, f1 |" X) _2$ y, _: j6 t0 \- q9 o3 `
3! i5 u4 r9 t, r5 H' b3 |
输出:4 m9 P& x+ C- V) ]- w0 {2 v
3 j3 g9 @: ?+ X; V# w b+ s
/ F) @& z5 }" g. m& _( c
3 H0 M- l- `3 y/ J- a( y2 W7 y选出 中心处 14x14 的:8 b* p4 g3 G$ g: b/ y1 O
, M! |2 h3 t; s ?; v1 g3 v9 }my_slice = train_images[:, 7:-7, 7:-7]* z' v$ D/ |' R( U& D' K
plt.imshow(my_slice[0], cmap=plt.cm.binary)
7 Z0 O0 l5 M$ ^; y ]+ uplt.show()
, x: K2 g& c7 j7 Y7 s, b& C17 u1 j( L: o/ F
2
) O# A' `* y, y) M3
+ }+ d' D0 O1 M输出:! q. m7 i7 m* m; p& [
( c# A8 \3 U$ a& n
* p! X! i1 Z s: n3 f
4 K0 J. i# [& ]4 v数据批量$ m. S/ p) K0 G1 h
1 ?, k: P& M. Z- S深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。/ R! a& m3 A, o+ a' E
! K8 S* I# \( R! f, ^* K o
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
2 y$ \2 C5 y9 }, H
8 l t% t/ X% w在 MNIST 中,我们的一个批量是 128 个数据:
8 i: r# X+ z, K% b" C
! x+ e& K( A0 h' ~' V# 第一批6 Y* W7 k! w/ A% m
batch = train_images[:128]
' p0 E/ Q: ~& Z8 I: C# 第二批9 E5 |2 X1 M5 I9 J$ l- ?# L
batch = train_images[128:256]9 m ]) {3 t2 k# B- ^& P8 J
# 第n批$ c! n: D# `5 p
n = 12
: f* {3 g4 |& P% N. U1 |" u7 k3 gbatch = train_images[128 * n : 128 * (n+1)]
9 K( e/ W8 {2 @/ W; |1
1 {- g7 R- v! |# P( P1 Q: C25 Y9 b& K# H# y2 ]
35 ~ e. O* Y$ T X, z6 |9 I
4- N! F6 M( v, V6 B% z1 X8 f. U
5
& t( V. n5 \# X6 z" N9 j$ E+ R- k
7+ l: o# T' w; A& q/ p- k
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
- F3 d. g6 i# v! u; {
0 p. h" Q9 ?4 K4 h7 X5 m常见数据张量表示: U$ [4 Q+ ?/ i# V+ v6 t
: ^9 n! j: L4 F$ W/ K数据% h" g4 @/ c3 n3 p
|
zan
|