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