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