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