本系列将由浅入深的介绍卷积神经网络的前向传播与后向传播,池化层的前向传播与后向传播,并分别介绍在不同步长与不同填充的情况下卷积层和池化层的前向传播与后向传播又有哪些不同。最后给出完整的Python实现代码。
完整目录如下:
一、CNN ⇒ \Rightarrow ⇒步长为1,无填充的卷积神经网络
二、CNN ⇒ \Rightarrow ⇒步长为1,有填充的卷积神经网络
三、CNN ⇒ \Rightarrow ⇒步长不为1,无填充的卷积神经网络
四、CNN ⇒ \Rightarrow ⇒步长不为1,有填充的卷积神经网络
CNN卷积神经网络的原理【附Python实现】
上一篇文章已经介绍了有填充,步长为1的卷积神经网络,本文将继续由浅入深的介绍无填充,步长不为1的卷积神经网络的前向传播与后向传播,有填充的池化层的前向传播与后向传播。
1. CNN的前向传播(无填充,步长strides不为1)
1.1 卷积层的前向传播
给定输入4x4的矩阵A,2x2的卷积核W,让A和W做无填充,步长为2的卷积,得到2x2的矩阵Z。示意图如下。
1.2 池化层的前向传播
给定输入4x4的矩阵Ain,2x2的池化核,对Ain做步长为2的池化后可以得到2x2的矩阵Aout,示意图如下。
2. CNN的反向传播(无填充,步长strides不为1)
对于上述前向传播,我们将损失定义为loss,我们的目标是去minimize loss,记loss对某个参数x的偏导数为dx,先来看看池化层的反向传播。
2.1 池化层的反向传播
loss对池化层输入 A 1 A^{1} A1的偏导数为 d A i n 1 dA^{1}_{in} dAin1,池化层的反向传播的数学表达式可写为 d A i n 1 = d A o u t 1 × d A o u t 1 d A i n 1 dA^{1}_{in}=dA^{1}_{out}\times \frac{dA^{1}_{out}}{dA^{1}_{in}} dAin1=dAout1×dAin1dAout1,其中最关键的一步是搞清楚 d A o u t 1 d A i n 1 \frac{dA^{1}_{out}}{dA^{1}_{in}} dAin1dAout1怎么求。我们由之前的介绍可知,池化层分为最大池化和均值池化,我们来分别探讨这两种情况。
2.1.1 最大池化的反向传播
假定给定2x2的池化核,设定步长为2,每个池化核区域内的最大值由彩色方框框出。则对输入矩阵Ain进行最大池化的示意图如下。
则我们可知
A 11 = 1 × a 11 + 0 × a 12 + 0 × a 21 + 0 × a 22 A11=1\times a11+0\times a12+0\times a21+0\times a22 A11=1×a11+0×a12+0×a21+0×a22
A 12 = 0 × a 13 + 0 × a 14 + 0 × a 23 + 1 × a 24 A12=0\times a13+0\times a14+0\times a23+1\times a24 A12=0×a13+0×a14+0×a23+1×a24
A 21 = 0 × a 31 + 0 × a 32 + 0 × a 41 + 1 × a 42 A21=0\times a31+0\times a32+0\times a41+1\times a42 A21=0×a31+0×a32+0×a41+1×a42
A 22 = 0 × a 33 + 1 × a 34 + 0 × a 43 + 0 × a 44 A22=0\times a33+1\times a34+0\times a43+0\times a44 A22=0×a33+1×a34+0×a43+0×a44
所以可得
d A 11 d a 11 = 1 , d A 11 d a 12 = 0 , d A 11 d a 21 = 0 , d A 11 d a 22 = 0 \frac{dA11}{da11}=1,\frac{dA11}{da12}=0,\frac{dA11}{da21}=0,\frac{dA11}{da22}=0 da11dA11=1,da12dA11=0,da21dA11=0,da22dA11=0
d A 12 d a 13 = 0 , d A 12 d a 14 = 0 , d A 12 d a 23 = 0 , d A 12 d a 24 = 1 \frac{dA12}{da13}=0,\frac{dA12}{da14}=0,\frac{dA12}{da23}=0,\frac{dA12}{da24}=1 da13dA12=0,da14dA12=0,da23dA12=