- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558544 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172936
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
3 ^7 W: ]4 K4 B3 JPython深度学习之初窥神经网络) L8 S9 |0 p2 g* |' }7 j
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
* w9 |% n1 J0 M* g
, m6 r2 Y; m, V3 @) u本文目录:
& c8 p* |, I; w7 x7 w
. V! t, P2 G/ j5 Z; i: _0 f/ a文章目录1 r' X$ X3 S% n) o0 R% J: T3 S7 T, a
N# u v$ O- Q5 t4 x5 {. u* T
Deep Learning with Python g2 D# a( S* ?3 L4 j7 o( [
初窥神经网络( V2 q2 Y* C' O: b) w9 Z3 @0 C
导入MNIST数据集
' J. h% H) c3 g/ B网络构建6 G6 g A& J& l- T+ a
编译
( I2 b4 a# X# \# Q. M+ S! A7 _预处理
- P H# O1 ^% @+ l5 f2 a4 e5 \$ G- T图形处理7 |( y9 B; P& m, _$ N
标签处理
+ C4 j+ k" [# P, H训练网络
3 ?6 j9 ?2 P: y: y3 I8 H神经网络的数据表示' b1 H& Y2 N9 R; B, O! j- Z9 N
认识张量
# k! t/ k# r/ I& {( C6 j标量 (0D Tensors)
4 w( L. n( T8 W$ A( ^向量 (1D Tensors)
1 g. q8 C9 |) B) n Z# ?. Y7 ` |矩阵 (2D Tensors)5 v ?1 u# [; p% |6 W' F
高阶张量
; t" i. q8 k: H! g张量的三要素
, L( S$ a/ b2 \3 GNumpy张量操作2 u( Q2 R' A; g }; X# n0 |
张量切片:
, [# t# w ` Q* y. X! b5 H数据批量
% R* U% x. x( Z( h常见数据张量表示% O3 g) j" ?0 G1 d. h9 p
神经网络的“齿轮”: 张量运算+ h6 ~0 h5 F4 k" s: J6 F5 F
逐元素操作(Element-wise)
7 c6 l6 O8 S u4 u/ T% v, ~) p广播(Broadcasting)3 L& z( K+ U5 L
张量点积(dot)0 }: D2 e% k8 z
张量变形(reshaping)- N1 w, r2 P; M
神经网络的“引擎”: 基于梯度的优化5 B% U! O* Y5 O* A, X7 T
导数(derivative)2 `, ^3 W+ R e, P6 T0 K+ k/ D
梯度(gradient); h! H, I( e9 W8 u) n& z
随机梯度下降(Stochastic gradient descent)
% @7 N+ W1 P, o+ O9 a: X反向传播算法:链式求导3 |' c% g6 x) ~0 A" ~
本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
( f- l" s# P, }; b' t8 A- L
2 i0 G. o6 ]7 _, }: @' w M! G初窥神经网络
8 u( E6 W) K0 U% c3 b8 P! n
7 }& e2 p5 Z# [学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
{0 Q5 W; W+ {' `/ Q' G
+ S, }% H& j; L3 b7 ]( cMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
, `7 t! \- r: j& s, U3 ^5 S6 q
# l( R- C e2 \& o: Q$ x5 T导入MNIST数据集
' v' o! [* q& a D$ ^' H. L5 K+ |( v) H: {% v+ X5 J
# Loading the MNIST dataset in Keras
3 O5 U! A2 x3 @8 q4 \ d" ifrom tensorflow.keras.datasets import mnist
5 {7 c& |9 C4 }2 [(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
1 h# Z4 N& J3 x: f12 d$ H- t' Y7 i2 `* \' \3 n1 q @) C
2
) s% \6 `$ u! G, f9 T9 a32 q7 v9 F' R) |; B* i' W3 p1 T
看一下训练集:
- |; l8 U Z( Z$ i' R8 r5 `; j* o: C1 z/ K
print(train_images.shape)
}) G) g$ p1 o, y4 Oprint(train_labels.shape)) h3 v. m% l. t, e
train_labels
2 ^( s/ F) y/ @1
. z9 Q2 g* q; H8 N& _" O I2
4 g: i% v7 {! @5 i, T- i33 O; Q) |% i4 N$ K3 Q2 X
输出:- k2 Y/ D! Y8 p3 Y& |6 A
' m/ H5 b% Z6 s7 L
(60000, 28, 28)
0 Q8 I# a5 Y+ B3 g; `(60000,)
2 w; m2 z' ~) P5 c
6 v' S, J2 i C- barray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
6 u s) ?" L W6 p; Z2 m6 B1# ^ Q+ x; M! `* O0 h) D! S
2
+ F1 ?2 t1 \( ~. f$ f3
; a# r/ g4 Z& i49 f, q' _: s3 r& ]- }! I; |7 }( Y
这是测试集:
; X: W# {5 L" p/ c" Z; ] D
) L4 m+ G x& B7 Pprint(test_images.shape)1 v0 L% D( a' D |& U, Y g
print(test_labels.shape)( b* {+ {! e' v
test_labels
3 d( m$ x# J" y# G* d7 p! y5 ^# z1, ~& R" K6 ]; z! v$ e! y
27 m7 s( F% L9 n7 P' t5 ~
3, v5 y p/ Z' ~' r1 g J( D& I& {
输出:
* N8 ]) X( F4 O% Q+ K! l0 v( f5 |' r9 N6 i
(10000, 28, 28)( V4 F+ Y0 ^) A
(10000,)
4 [* t8 t' k" x8 m v& m8 d4 t4 R
8 R% ~# Z2 `0 E. Q' Oarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)- V ^/ j/ [! B5 Z& [
1, y1 z" Q% M( M8 [" [7 y% d6 i
2
7 Q- ]# \( `3 n' h1 t3' l; A7 U/ O" V1 A
4! o. K/ y P0 U. b6 I) P- V
网络构建
$ Z3 D% I' s) b# j1 P, o. ?. Q4 X5 \4 ~7 }* t
我们来构建一个用来学习 MNIST 集的神经网络:& Q$ b- S+ f% D
( A, M* \+ V9 ~; z4 s# L
from tensorflow.keras import models
J5 {" h( ]+ v) {0 i) ufrom tensorflow.keras import layers+ @/ p5 V/ U' d% Q
: ?. G4 q$ R2 {1 x6 o" j
network = models.Sequential()! |, O5 J- F8 r6 [% H8 p% A
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))3 D5 X: y8 Y$ v8 U
network.add(layers.Dense(10, activation='softmax'))
6 A) K2 N4 F9 y. K11 W9 H1 S8 D5 ~, z& K+ P4 y
2) M9 a; h7 O& o, q
3
3 G- K! @9 L# @9 K2 w! b- e/ f4
) P, K' d3 g( J% q D5
% a; S& c8 w; C5 N; `; M; o# a6) u$ r7 W/ p5 j* h9 V
神经网络是一个个「层」组成的。7 W. _% D9 P! u9 _ }0 M
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。6 [$ W- w' l) e1 W0 \+ E0 c
. t" l, ?% g6 Q
这样一系列的「层」组合起来,像流水线一样对数据进行处理。" ?8 L. J0 i' A0 d" g
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
# f4 }( p5 D. h v
6 ~; G$ w$ t9 {" p! X& W. a) b8 Z我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。) x( v ^4 V; d3 W2 l+ A( N c
2 s; a! q. q5 O4 K- I/ e1 V
数据到了最后一层(第二层),是一个 10路 的 softmax 层。) G) s) o" J3 _6 B5 J, x
这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
( B+ ]" q# Q5 Z4 r事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!7 `* P" R' P: T5 w4 v0 \
5 n! F+ q# ^: y E9 ^' o4 r# R编译
2 i5 t( L2 \# a- L/ {9 y" s+ D; v- ?) O g# S, w
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
- Y0 Y- y% i; R% L: H) {: j$ T/ D; Y/ X4 o: D" c/ I" H
损失函数:评价你这网络表现的好不好的函数2 }1 U' S F. z3 \% @8 {, Q2 E. \
优化器:怎么更新(优化)你这个网络6 h3 W! j1 ?# A3 E9 K
训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度0 F- \& ~4 ]7 ~ \
network.compile(loss="categorical_crossentropy", R7 H/ X% d( r
optimizer='rmsprop',( }9 H0 Z$ V- A$ K. o8 w9 o$ K
metrics=['accuracy'])
! v. F, |; h! ]" w3 J( B: Q1
: l' K Z' j$ L3 ^% y2
8 K( A0 q/ Q( Y2 @2 v: K7 @3
$ r0 s: l# ~0 U% ]3 a预处理
* v' ^1 X* ^9 }$ T# a& T" K5 _9 i/ `- |, ^
图形处理
8 R; W+ M7 B+ A8 |
/ s3 F8 G6 \9 Q1 i6 d. c# G我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
+ j6 h3 S4 X! I; j5 f" Y5 O l, X
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。1 L4 k" m7 g2 N- v7 l
而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
) ?" ^# y" H. p% v; r+ H
% C2 Q* ?- N( K/ V1 Etrain_images = train_images.reshape((60000, 28 * 28))9 i9 y* q/ \( T+ R' H% \- `" ?/ K
train_images = train_images.astype('float32') / 255
1 K/ P; B* F5 U
1 n3 ?: [ ~; ~. ytest_images = test_images.reshape((10000, 28 * 28))
! F, C9 j7 U7 |5 a; atest_images = test_images.astype('float32') / 255! L3 ~( b% B8 C& D, p
1
# k4 i8 S9 t% R# ?2
8 n/ c9 _9 }2 c+ d2 M7 [36 |9 v% u. D5 ?" [/ y) J1 y
45 L& Z) ~* q; e
54 Z- a- y+ W$ e0 `/ C
标签处理
& S' [6 w, Y9 z# D' H% X. X2 R9 {: \" Y( k3 H/ `
同样,标签也是需要处理一下的。
4 @! A _" a* \6 z
2 ^0 I# y5 `+ l6 P0 D4 T; M7 Pfrom tensorflow.keras.utils import to_categorical
0 M. K' p& } D, S: c5 C. R, o/ t u) [9 {, e
train_labels = to_categorical(train_labels)4 m: m, e6 v' o, Y6 J" w( s3 H/ x
test_labels = to_categorical(test_labels)
/ Z$ [$ i0 @; M3 Y) G+ ~1/ X( @$ t! y2 }* e$ O: o
2
* C3 g( {1 `5 ~" Y33 F+ o; Y' k7 Y8 ~" q
4" w7 t+ h4 Z/ Z% M
训练网络7 t! N& k3 ~( d$ O; `, M9 K$ n) C4 q
8 U- c) p$ I4 J. {
network.fit(train_images, train_labels, epochs=5, batch_size=128)
; V& F/ k1 p5 R1
, _ B/ W6 f' T& ?0 f6 W5 O输出:
. ~. d% Y; i: z4 r. E& K" |; ?6 e9 P
Train on 60000 samples
8 w3 s1 a) P9 h2 f+ D) EEpoch 1/5# A7 T6 h$ f2 e5 }' b! O, I0 B5 `
60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
/ M& q5 \9 e4 ^3 e! y! lEpoch 2/5
* x+ \8 z& G, x/ v) q A60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
0 ~& O% c+ K% T j3 q! H3 e1 D& {Epoch 3/5+ w- b5 g/ z0 @# \) g
60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800: _# l1 e% |" L" O; Y9 x2 m
Epoch 4/5" {* C( o* R: }* o9 r$ U2 o
60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
; `2 `4 u1 a" LEpoch 5/5! k1 ~ \& g1 v5 A% n! | g3 ~# t, ~
60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
4 }. J3 j( ]0 A2 A8 ~2 [+ m. ~& \5 i/ o2 [; ^$ i9 G
<tensorflow.python.keras.callbacks.History at 0x13a7892d0>+ Q2 T, X& P. J' W0 X/ v
18 [4 m& |: R/ ?4 e- \# T
20 i2 J: B# m) Y8 A1 E$ ]+ r6 C1 j
31 L1 }+ l" K v$ R% J, P& f
4
5 e3 P% [8 L( e5
* z7 G* H9 S/ ~/ p) b2 ~' ?6
/ A3 A: @/ {" v4 W7
9 ?6 d3 P2 ^ {+ ?- U8
) R" O: l8 X5 w) y0 b& B" @4 e# n9
* w: W5 H& E0 h. H7 O. e107 h8 F) O W6 x4 P5 K2 m% v9 U# {
110 n7 A% p9 s9 G1 {* d( k
126 e. d$ W+ ?; m0 c' \1 w) F
133 U1 o1 B. l& H' J
可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。, @% r9 U- t3 h! u) R/ F. f
4 ^, J: |' Q' W1 p( ]2 U9 U
再用测试集去试试:
* P( L1 ^0 F8 B6 G; l
1 c3 C% e k, a t! Ytest_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+ E3 A' m3 ^5 x# v W1 Y
print('test_acc:', test_acc)+ e* ?9 I+ }9 y
1( {! X1 A! l/ R8 A
2
1 q2 Y1 s, q3 [6 \# o输出:& E; S5 y' c7 ?' n' n0 |- _
5 C& i) t5 r3 ^$ m' J10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
+ e, L4 I& p% N4 J; q: U4 Ptest_acc: 0.9789
6 Z' M$ e8 ]) U" a9 ~2 d0 p$ E1
8 }9 c) k1 [ W4 j+ [. D5 d* j2
- v t! a7 K5 y% E+ T _4 W我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
; V! A9 ]! q0 D, ~8 J2 f% ~+ T% H9 p+ |8 U) K+ G
神经网络的数据表示7 O) M: p2 J2 ~1 T8 B( h4 R- k
) h2 o, U. b( |, J9 VTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。) M! m6 Y& q% n" V* a
( F% b9 t2 z: I* _8 l' F- s
我们常把「张量的维度」说成「轴」。1 _* e c e! b6 d
. ~5 x" o5 C4 @$ J; |0 l" e7 @
认识张量
8 M7 M: D8 S& Z4 [ k& R* V
1 {* m# m* n- H1 v* u+ E1 U标量 (0D Tensors)
; z, a6 ~' Q9 y" t6 `# C6 |
0 h3 \: S: ^( p. GScalars,标量是 0 维的张量(0个轴),包含一个数。0 i* E5 T( B/ J
3 @. m8 T, H$ Y, H2 x) V. N5 B标量在 numpy 中可以用 float32 或 float64 表示。8 P j. D+ D) r* M* B A4 r
# {! m- ?. ]4 i1 j. e. d1 |& D
import numpy as np
9 S; G, L. P2 E& m9 i0 b! g9 r; x; _+ _( q$ g* ?1 d7 ^
x = np.array(12)
3 C) x+ B- _% V. Ux! v9 I' |1 ^0 S _
18 N- n9 E+ @+ R, m
2: D! ^ T4 @: j x" b
3
. b f4 u# j, L; p! m& P, P4' A3 _, R( _/ A+ l* _# g0 \/ e
输出:
B/ i3 y- q& Y' m9 X0 ?
% ~- c: Q% H+ E3 h+ R1 Q; Y' `2 sarray(12)6 S. w) l+ o8 J5 @) d' K. D* V
14 A( M9 r; G0 p+ t$ ^
x.ndim # 轴数(维数)
# p- L1 h8 ]* v. _; h/ X2 m" A, b1
+ B, B0 Y0 R( J* \! b* m输出:
& M3 b* v( K9 U" \/ K5 n: H+ s" w& p9 M
13 d7 K8 i; k( z" A! B7 }7 {
1
5 |( O. j+ x4 l% ~! e6 y向量 (1D Tensors)
7 f. ^8 f. Q7 y1 r( p4 F* q6 m3 j6 k8 t; T$ p1 n0 m: c+ K: D
Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。$ W) j4 {+ j7 ]8 C% s0 }
, T% A: \5 [, M9 c6 { V# lx = np.array([1, 2, 3, 4, 5])
' e8 b `2 L w+ U3 a" g* ^x! F* {( N# v; T; p: k! u7 r% X/ T) Z
1: F: K w) Q3 `1 S
2( n9 i- y2 j9 p& T3 p
输出:9 W2 \5 T- K- V1 v' _
& |. j% {5 Y3 H( Z' ]; L- Yarray([1, 2, 3, 4, 5])
& `1 x( m; v7 U6 s3 M1% ~. A7 I9 {: |: Q# `8 m
x.ndim& J6 m3 o; [% f2 D0 p9 M9 D
1
. Q* B+ Z( h* q [# a/ i: f输出:; f* a! w: d2 e- L% m. s6 q
0 R: g% H8 R% I) c1( h9 G2 k* g/ i; ]2 s5 Q
1! D/ B! b$ `9 H& M/ [9 U: \, H3 e
我们把这样有5个元素的向量叫做“5维向量”。
9 q, ^ `" C8 u" R但注意5D向量可不是5D张量!
% J# Y# C- o* @$ |/ r
/ C) h2 e/ k2 K6 e" [5D向量:只有1个轴,在这个轴上有5个维度。
" F8 a, y F6 a9 v3 q5D张量:有5个轴,在每个轴上可以有任意维度。
; X# H2 ?2 `+ c+ V$ R这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。- y4 `4 p7 V/ a) {: W
H9 f) Q& G6 n$ k+ Z+ |3 i9 {
所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
. X6 M% G# S! r1 I, f! k
, K/ ]. f8 z) i8 o矩阵 (2D Tensors)
5 K6 m- s3 l2 e [: w- O% i; _# C/ h1 F- b+ E$ [/ j0 a
Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
) I3 S/ B2 M d. c3 `: ~' K/ _, n- C# H
x = np.array([[5, 78, 2, 34, 0],
1 |4 f6 V. t- [, y2 _) l [6, 79, 3, 35, 1],
6 v5 T' F5 i' g4 ?* P [7, 80, 4, 36, 2]])
1 C' G, |2 G1 w0 Y: W! Hx
8 z2 V& R' A. ]5 N) w1
2 u: U: P+ t! R. b M9 w- J2
& z0 m3 _ v2 ~1 s% c5 n36 N8 L0 P8 Q& \( Q: i# Z' z
42 [. L! o* |4 R
输出:
: |1 n. L( ~9 ?* c8 X5 ]& E& P1 ^, o$ }) [2 t: s. u- G
array([[ 5, 78, 2, 34, 0],
( i0 V. H& L j$ p [ 6, 79, 3, 35, 1],4 ?9 {# r( ]1 R K N; N* ]
[ 7, 80, 4, 36, 2]])
4 Z; a$ |; j2 @1 Z: T( s; r& ^ H9 `2 ]1; n( i0 c' O4 E h2 c' b
20 B. X) P4 I4 w# h
3
9 k% Y. m, a" W. Y0 Dx.ndim
" }4 G- [9 B8 a$ X1+ r' u5 S7 ~, x$ A9 E
输出:
0 T8 u" ~, [1 w+ [6 N! Z
5 x( G# Z' e+ z ^+ C0 P% k26 x5 R. J6 [* y! S7 K: n$ O+ e
1
/ M1 N5 f& q& h* a; o高阶张量! _1 B6 @, R$ r3 M: B0 C7 s
; K7 F# ^3 H/ j
你搞个装矩阵的 array 就得到了3阶张量。
* w. `; D1 H, q+ l& K7 G. w/ @: R% L E5 A7 k
再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。. d' _$ ^" i8 m. l$ i
3 B, j! e7 @+ Z n# d7 |+ x. L0 U" m
x = np.array([[[5, 78, 2, 34, 0],6 I1 G; B2 ~; N
[6, 79, 3, 35, 1],
6 h2 t3 M- d% w+ C J; @, ^ [7, 80, 4, 36, 2]],
, d# a8 S2 d+ }) O" z [[5, 78, 2, 34, 0],1 `4 `1 Z& `0 [! |8 G
[6, 79, 3, 35, 1],: b, G; U! u! f
[7, 80, 4, 36, 2]],
1 S; d' L9 \4 l" F( x! D [[5, 78, 2, 34, 0],. y% s, g+ Q1 e, a- u9 T
[6, 79, 3, 35, 1],' j0 v+ b* t1 c8 S' V8 A/ y( Y- R5 `
[7, 80, 4, 36, 2]]])3 R3 }8 P# T5 c& i7 S) O! i% T
x.ndim
, s8 l" f0 i" a7 |; m7 o4 I6 W: n1
7 V! \5 Z' @, G! ?; X( ~, ~5 F20 Q. o( X: C1 j( m2 k8 z7 J; Z
3
6 A! d# X$ K; H) X! |8 S1 J3 L4
" e9 T; }3 E# q' A' l( K+ c: c& L5
- V9 h' U, Z. c" |0 X1 Y' w# u) m6
: o1 t1 \' m0 R7
_/ s2 a% m$ B6 K& ^7 D/ }8 R8
6 |5 i! S# y) I5 R9
! `9 ~. D; [% f e10& R9 J* J5 Y/ O& L1 r
输出: H2 Y. K% e. v8 I
% d. P3 h4 B9 Z+ h2 {34 T! [# t! \: |
1; n/ n4 n x' C0 L1 l) Q# g0 z4 V2 U
深度学习里,我们一般就用0~4阶的张量。
' f8 ]; R5 w1 q. W! J- n
& U, x5 |3 O: S7 J4 l m4 q张量的三要素) h' [- T8 M* l: w
x/ A# |7 j0 q/ T# R' |& K阶数(轴的个数):3,5,…3 `4 H, k( f* T# n
形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
/ j+ X4 b9 d3 j$ z2 b2 j2 @9 v数据类型:float32,uint8,…
4 y# n' k* B C5 p8 v M. A我们来看看 MNIST 里的张量数据:
2 V8 N/ g6 Q3 d2 k$ b
7 d7 D* H; \- B# t' g2 q" Hfrom tensorflow.keras.datasets import mnist
! T& X$ d8 |) T1 w4 \* a(train_images, train_labels), (test_images, test_labels) = mnist.load_data()1 _: O; ~6 u! {5 K9 H$ ], h2 e
- ~1 t" l1 F; P0 h$ B) B
print(train_images.ndim)& G7 _9 ~5 u, D% `
print(train_images.shape)$ E2 Y8 R c2 ^/ p9 d5 ^- v
print(train_images.dtype)3 z2 A+ l+ X1 I/ J% v( j' D4 M
1
8 g- e p: q- z3 D& t/ l5 _0 @28 ?, v* p$ U% v# D' H
3
( W# G; n* F9 t0 v4; |- x5 ]; Q- n: v
5
; w& ^6 p. \6 G. @* `% U6! e. G# X4 L! O% O9 t8 t
输出:7 v/ S9 [! K- f, \( [
& h, Q4 F) W9 L3 ]) v G3
- e5 w0 ^. l; u4 e- G/ {- M(60000, 28, 28)
, E& x: x4 C$ ?9 }% Ruint8- h4 S5 k6 A ]- P, i1 u' E
1* q! z9 O+ B3 a5 f
2
" }3 }/ h/ v' W3
0 I* \3 V' \2 c$ p3 m, M ~- _所以 train_images 是个8位无符号整数的3阶张量。
2 k, c6 q" k" L& n" V! J2 o- p( X* q
打印个里面的图片看看:
! y( A) ?- J" a& d9 B& [8 q1 f* h1 d r) S* e
digit = train_images[0]9 o- `2 C4 c0 U, A3 ^
9 F9 l- h3 ~, J7 ]
import matplotlib.pyplot as plt
/ x/ V* r& _/ o) |
/ C9 T; S7 ^5 J7 r2 Fprint("image:")
# ?3 I Q. N. i3 b) c' Y! Vplt.imshow(digit, cmap=plt.cm.binary)
# N$ H8 |* J- g# P; \plt.show()
" G ~3 y k( Z$ \: z2 e zprint("label: ", train_labels[0]). O) U& y1 y" v+ c1 x
1
3 t. |* c$ U+ I/ d% T1 M; c( b- U2
5 |$ P- ^6 h5 x8 B3
& K. t W& R2 t J& h1 Z( P4 Z4& [! j1 m2 E5 ?
57 k# |9 O& q2 i* j
68 c( U6 p2 w) ^ T" d- M2 I3 l1 `1 u
7
# H" C& J6 w( n3 m8: s) Y, S/ o+ _5 I# a4 Z
输出:4 k! s; ?: }: C/ F+ W
! e" Y7 C( N; a
, v$ P* S, x7 Z+ d5 ]
: v3 Y+ W) `" P2 ~8 }. @( e" K, z
label: 5% @: O$ G; a# \$ n- |( b: t
1- G2 E, F' J6 [2 b' I8 _
Numpy张量操作3 D6 r9 q% k: e4 B; ?; _/ A
6 P3 y9 j2 O+ l0 h$ }张量切片:
5 |* h' \; ?+ N0 q1 l9 c4 [5 P1 i+ @1 f$ x: t0 E2 i
my_slice = train_images[10:100]
# |/ ?3 D9 g) u* mprint(my_slice.shape), I: l/ l' f/ f: L
1' @7 C8 ], s9 d5 M, u7 |
2
/ B7 j) @1 H: t# R. R输出:
) o) `! j* V# M8 ^. J
5 a* L1 F. O+ W" R& K9 h- `(90, 28, 28)
5 e9 a" A( V# L) F! X( B1 f2 M1$ T; p; a( _0 p- w6 D/ J/ \+ \, w
等价于:" M! p+ l3 v1 m: D8 @$ b
9 W" e+ d8 T6 s! H- B( `' xmy_slice = train_images[10:100, :, :]! H3 i# f5 R' D
print(my_slice.shape)
8 ?8 _% z4 t0 i R/ N- k1
" r2 m7 J, s% y( C6 h" g2
3 `( Q# n5 U6 l* W7 w7 E输出:
7 L" ?" D* ?$ }; c
) f& x: P7 j+ Q. {1 f% e(90, 28, 28)& ]# U J. W+ j
1* G% y7 c2 I @9 g# h+ R& z' c
也等价于. O4 G8 L0 I# @" \. a8 N# N4 _
$ v! z0 A! h/ P& Y T8 _my_slice = train_images[10:100, 0:28, 0:28]% j/ R0 d' C' _+ ~* T8 x0 @
print(my_slice.shape)
- N8 _: [, F, |' K) B1
# O3 `5 |, l) U% q4 n Y; I2
3 j: n* O* e# P$ z输出:
+ f7 p8 \, l5 f9 t" }. i/ l
( i. j% e5 c2 l# J(90, 28, 28)
6 j) ^; a0 q+ v6 e" }1
r1 N. s. K# i) d$ W4 {4 r- j+ ^选出 右下角 14x14 的:* H; S# l9 O# [' ~4 f0 ^
/ h0 q7 K; N3 I6 w$ _
my_slice = train_images[:, 14:, 14:]
1 ^& w: c" u7 {, Y+ a) }plt.imshow(my_slice[0], cmap=plt.cm.binary)
1 y7 ] J- K4 F+ V3 Eplt.show()+ {: J2 q3 T; G1 [4 @! b0 c
1, P$ T9 e* v# \" q6 e
2
) X3 o. K; o0 h9 s( }5 E3 k3
9 x7 Y5 x& c. x+ B& ~4 V输出:5 @- }' y7 h0 G' {7 v
: p- H7 V r# L
' e8 }+ U( p) @' o
3 j9 k3 h' d- B: j$ C2 x# I' E* p
选出 中心处 14x14 的:
! [' r( e$ k3 q5 D& ]9 p0 ?% M9 @ B
my_slice = train_images[:, 7:-7, 7:-7]8 `2 H" o+ S) _3 o! d* ]1 o
plt.imshow(my_slice[0], cmap=plt.cm.binary)( f9 A- E0 F! t7 h% T' U8 v8 Z; J3 ?' I& `6 x
plt.show()
6 [* M' I( n2 D8 i- L16 `( `5 I4 X- Y& C3 y6 i
2: y9 E* x e3 }* L- m" \# T5 I0 U
3) V2 t }2 l0 s# B: ]( i
输出:
) X' `4 s( k0 D; ^" W, K; P
, n, U% v7 E8 X( s# k& t) |" n
* _$ H( |9 M# d7 t4 N2 ], l0 \) L* A1 G% I) S
数据批量: o) B7 C A3 |+ l: e# |8 f) Y6 m
, ~3 r3 ^4 F! W" r# s5 |; G" R' J深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。" w: r8 C x) `- f, M
( c) x$ P% D b+ {! e: a8 |/ G: H
深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。" `' i& s. b& r0 K
) V V& {9 k) i( B3 B1 B在 MNIST 中,我们的一个批量是 128 个数据:
$ ~+ |$ G7 U' ^1 }) [# [3 O+ u3 t- ^: N3 u5 E
# 第一批
4 s/ \: Y. S8 E0 rbatch = train_images[:128]* K5 g8 B7 \/ e& R( p+ Y
# 第二批
* v" i, @" v7 j+ |/ S kbatch = train_images[128:256]7 c4 l4 o6 x F5 R4 V0 }0 A g
# 第n批& B$ r! N8 A! C- ?
n = 12
0 \- @+ y4 _& C4 }2 v4 y4 Hbatch = train_images[128 * n : 128 * (n+1)]6 w+ V3 [2 U$ a1 `3 v( Z: k
12 k% x! I9 F {& }% l" l# M
2
8 Z( U+ a/ F w; _# l! ?3
- y$ r8 P/ f9 Z6 s- n! d0 z& @4
4 P- d: @' B& U% m. n' J& p# H5
7 A$ A: k8 u" f& H69 |$ X, l/ r6 y0 z1 R5 m
7" ]& A" W- m9 P, Z
所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
4 H0 M( [8 V6 @+ w* L3 H4 Y5 N) V& I7 e. e/ k" z
常见数据张量表示1 j$ g. Q! U. J% \( C
' z4 f" g O3 p0 R0 c+ g数据
, G7 A4 Q; g2 Z9 U8 m |
zan
|