! t+ S5 ~& ~+ c. K1 U$ \ {Python深度学习之初窥神经网络$ K6 d* ~6 L4 T
本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。# D! t( m& Y( j' }8 e2 m' O
2 R9 e0 j1 L" }* p( T. X2 t本文目录: ( R2 B9 e5 j' J1 \* Q5 z/ n: x$ n0 E' v6 G' ~0 b
文章目录1 x0 b: o6 I3 a$ V4 c5 M/ M
: ]1 z* ~- j. G* t& _3 d. K& x
Deep Learning with Python : i1 t% X0 x6 @2 G) F初窥神经网络 D$ ?8 W+ d- H& j1 Z+ n3 U. P导入MNIST数据集 9 U. z7 c9 r' u1 X/ V网络构建1 U- }5 P* C" }# i- |$ g) {
编译 5 i- h0 c3 f. s1 ]预处理0 a1 x- k: Z& W# P8 p/ _
图形处理, K2 S% E3 o; A# X& [
标签处理 * D0 V$ I# |% i4 T9 x& S训练网络% s0 l$ G$ j, W3 C# y" h6 Q
神经网络的数据表示4 x1 @0 ?/ ~/ e, K$ L
认识张量. `& }) d# W+ y! n6 v
标量 (0D Tensors) ! G* M. I2 ?: t向量 (1D Tensors)( z* s2 _2 H X
矩阵 (2D Tensors) 6 h5 u, B% r3 V! X) W' U8 X! {9 ^高阶张量 / d' i; [: D1 x8 ?7 U3 i3 K$ T张量的三要素 K/ t @7 \7 B/ h5 b( nNumpy张量操作 ' {6 P! p6 e% @( n0 g张量切片:" S; w# V! r. [1 U4 S* `, }7 r
数据批量 ; r G6 N" N. f5 } ]常见数据张量表示 3 Z0 F4 V9 D3 c9 Z% ]神经网络的“齿轮”: 张量运算 / s% V, c* u- [- S, |) e1 B \逐元素操作(Element-wise)1 R) B2 u2 ?8 z( m1 n# |" W8 o
广播(Broadcasting)% c# h1 q7 G( K) m$ X. N
张量点积(dot) 2 _3 d' @5 R8 K& @4 F9 g1 O* ?张量变形(reshaping) ' J2 R- j1 o; H9 W0 m0 K5 @神经网络的“引擎”: 基于梯度的优化 : X" l8 G5 K E1 |# G' N导数(derivative) 1 k) F/ g& T3 {" w梯度(gradient) + O, |/ U2 `8 ^, k/ q/ t4 t随机梯度下降(Stochastic gradient descent) 8 S# y' R" g* n9 B) Z反向传播算法:链式求导 1 O$ ~: k! {. g" a; K本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。. H+ _/ H# B5 q- r( W! D
0 E. z( E4 ~- Z7 z8 e0 U1 o
初窥神经网络$ q% z" q3 J: m2 {1 p& P& s
" ~$ z9 o7 [8 p% U4 a. y& {7 u& [
学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。 " j+ I9 T- T( M. k9 D7 V. Z: S6 X0 S6 r, e6 k
MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。, V! W5 E7 a! n' ]0 u: `" ~
/ y6 w" z. u& z0 J1 r导入MNIST数据集 ! I- Q' D/ V$ S2 l. }/ j9 M 5 J5 X$ ^: p: u$ `6 @$ X$ j6 Q# Loading the MNIST dataset in Keras2 I! `' J1 q8 D% B1 _
from tensorflow.keras.datasets import mnist& X2 t5 x- [) N O' y" S
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()* f: f+ l4 u: Z4 _( w
1- _/ n q: l% R3 f/ M
2/ f! p- a' I) c1 d8 G, @
3 * P) Y. B$ [* \3 |) L2 D看一下训练集:1 S& R2 }* S& H( y7 c4 L) n. a
% H5 Q: J0 R' m* [+ i
print(train_images.shape). O1 p2 `( W1 N/ }& P
print(train_labels.shape)* d S! V2 B6 h) I, D
train_labels & o# e5 r0 o6 P: x2 l% s1 " D/ i3 r* h& H1 }% r2 % T& c% d+ s& ~' |4 G3 9 [* e5 {, ?9 \# u1 j输出:7 V0 V2 R& o+ d* A1 P7 r
. \5 U+ g9 {* l) _7 g2 W- R(60000, 28, 28)" T% x2 F3 x: d& Z
(60000,); f" r; T0 r2 q) u
/ n& C! ?! S+ R8 x& _+ b+ p, b
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)- O6 x7 Q/ Q C( o' R& `
1 8 j2 W% o. U: {5 Z4 S2 9 Y* @* v& b' H# L& S- i. q# }3 ) ?. H3 t. C7 ?$ k. B# [4 W: S' I+ g* P, b# j _这是测试集:! V( y" y1 i" v0 X% a
1 ^% ?. v8 U% W) }- v: S; @print(test_images.shape)+ K- L$ L, \# P
print(test_labels.shape). i: i- s3 y: u* K: J0 Q
test_labels & D8 U, J- j" D3 u1 - Q; l/ Q. Q E ^& i2" x& n* X( v o+ }5 H) k
3+ j, f, w2 C/ ~
输出: 3 k. y8 i1 ~ a$ y* ?/ ]- Z* V& B$ x5 h
(10000, 28, 28): E3 L _) N1 }* \" J' I
(10000,) & k$ T9 B' p/ \# \! H( k7 D" p " E# Z4 G( g! [" a: c# `array([7, 2, 1, ..., 4, 5, 6], dtype=uint8) $ S+ }1 L5 W! O% u; i M& ]1 . g* o5 C$ k, p9 k. \3 v2 4 S7 u6 F, c4 S# s. g9 _3 : N0 H+ |) ^0 P# u+ g W; z# B4$ A: U* x+ N' X5 E7 F$ e! @
网络构建9 H% y6 I$ E& j! K
& P8 a$ v: A- d$ u
我们来构建一个用来学习 MNIST 集的神经网络:: N6 S, H" i) p7 N2 X2 Y
& Z5 g4 {# g' X0 a9 P
from tensorflow.keras import models + a1 ^7 v8 b" C) T) N! ^+ wfrom tensorflow.keras import layers % }5 ?' P2 }7 ]4 q * S# T2 x1 {$ snetwork = models.Sequential()3 G6 k+ p s4 v. G2 R
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))( c M @: h. ~4 i$ D+ U2 q1 B( T
network.add(layers.Dense(10, activation='softmax')) 6 P `: L y O1 d' z1 9 J! l" R3 @: H9 {# ^$ ^: }2 9 P/ I: l: M! S! L! A$ J- J, [6 d3 - t+ N2 J9 V. k7 ?2 t2 P4 0 T) Q) Z% n5 i" k8 r( r) ^4 v% B5 5 n6 z# Z' M, g7 v- S68 w6 {4 E. x$ ^$ j1 K* ]1 w
神经网络是一个个「层」组成的。* i/ d; U. a0 A/ h6 \: n* o
一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。 ' R7 g" Q- J0 y/ y! R( m! a8 C3 Q- c, D! s' s
这样一系列的「层」组合起来,像流水线一样对数据进行处理。- `; A* ?8 a& c: }8 u& j
层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。 ; @5 J. B! q8 c6 f: `+ w& `' y% Q% r9 {+ {+ T9 _% h( L4 T
我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。- \5 z) ~3 ~4 F: r# ^% E( @
' t2 N! w9 \9 O2 E- S7 F! A
数据到了最后一层(第二层),是一个 10路 的 softmax 层。 ' J- T" ]0 o0 s y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。 * } S. I, U7 T事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!& U/ [2 z) k- R. q3 _% R" N
- }& [+ D0 z. x: Y. v
编译 8 H" ^# r1 S0 [. {+ U- U) }4 n( Q8 {, u- \
接下来,我们要 编译 这个网络,这个步骤需要给3个参数:$ z* W8 \8 b5 q3 X
1 n% [6 ]# F6 N. \, T损失函数:评价你这网络表现的好不好的函数2 b' J( }8 x/ ~/ p/ V( V/ w8 h, O
优化器:怎么更新(优化)你这个网络 ) s0 M, M ]4 k训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度* @) L, Z; g6 w1 J2 z9 W1 ~
network.compile(loss="categorical_crossentropy", # j/ o% ~% Q" O) z: a optimizer='rmsprop',4 P0 X; v- e" _8 J' j
metrics=['accuracy']) 6 e% l& }3 }& C$ c1 7 B2 r9 j, w: ~" h, W) j/ u9 a x O2) I& I4 X: O: S. ?, T: Y7 G' |
3& S3 K. M3 z3 x- A
预处理 0 n: }$ [, I- o( S' d$ k0 v; L( |) X! O& s
图形处理9 H) P% e- T$ i/ C
: ~& r5 Q( d( ]; Q. e
我们还需要处理一下图形数据,把它变成我们的网络认识的样子。# A6 a8 c: F3 A
6 i+ K. k% C) s& o: r. J, j5 q
MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。 8 R }8 u: d( I& B: a( i9 F" x& U而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。6 Q6 o N$ `- ~6 q' ?" M$ ^/ I
* R, ^6 w! h3 l: T" c. U' S
train_images = train_images.reshape((60000, 28 * 28)) : O! w D$ M0 d0 u; Ktrain_images = train_images.astype('float32') / 255$ [3 X2 c3 \5 M: `/ e+ U7 Z. y
3 g2 D# Q) W& q$ f# E2 d
test_images = test_images.reshape((10000, 28 * 28)) , u* m) S: N0 Z7 ktest_images = test_images.astype('float32') / 255 . Y, v3 {6 E, R2 j" X1 " S9 K: j; W& O9 S i) K29 H1 y; y* l4 ?9 r' s3 L& J
3 - z7 b% L P6 @/ _5 {3 h/ N- O+ j4 C* |* [ A0 F( T" t
5 5 x8 _" _2 f- G- ^标签处理, ^ {' H. `7 M$ f
- H: G9 C1 C& l/ e* ~, M$ o
同样,标签也是需要处理一下的。 ( v! X9 L2 M8 N" s, k2 K& B/ m& |
from tensorflow.keras.utils import to_categorical / ^8 \0 s! d: p) F, @' l * _/ V8 B _0 P$ jtrain_labels = to_categorical(train_labels)" m; Z! ?$ l" l7 B9 c5 M' _
test_labels = to_categorical(test_labels)6 T N! h0 y" c3 N$ f, P* O4 W
1- E; m3 L9 E4 i$ H
2 ; B% Y/ h% }* p6 }3 K8 F* z0 U* P6 x
4 5 s9 l: R; }- j2 h. s训练网络0 }* }+ ~/ a# a* |& R$ c3 n$ k0 P0 j
1 T' R: Z: Y: L9 {; l, E! a& |
network.fit(train_images, train_labels, epochs=5, batch_size=128)! F& h1 Y" d. o1 r/ p% }. q. @
15 N# d; P8 Z$ t+ Q1 r1 m( b/ c
输出:3 v/ A/ A* C6 T. ]