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