CNN原理理解
参考博客
https://www.zybuluo.com/hanbingtao/note/485480
卷积神经网络
卷积神经网络(Convolutional Neural Network, CNN),示例图如下:
一个CNN由卷积层、池化层(pooling)和全连接层组成。它的常用架构模式是前面是卷积层和池化层,最后连全连接层。
对应上式,更通用的说法是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
CNN的整体层结构:三维排列
全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。(例如上图)
深度对应着filter的个数。只跟当前层filter个数有关,与前面层filter个数无关。池化层只是缩小feature map的规模,与深度无关。
输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。
在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个**Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样**,得到了5个更小的Feature Map。
网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。
卷积层的计算
注:权重是对应着filter的每个元素,而不是图像的每个元素。
与filter计算相关的重要元素:权重矩阵、偏置矩阵、步幅,filter的深度与图像对应。上一层的filter的个数决定了这一层filter的深度,这一层filter的个数决定了这一层图像的深度。
filter的尺寸、图像的尺寸、步幅共同决定了生成的feature map的大小。
W表示宽度,H表示高度,F表示filter的宽度,P是zero padding的数量,S是步幅。
zero padding:周围补几圈0,对于提取图像边缘部分的特征很有帮助。
下面是深度为1的卷积层的计算。
假设有5*5的图像,使用一个3*3的filter进行卷积,得到一个3*3的Feature Map,如下图所示:
整体的计算过程如下:
上图中步幅为1,步幅可以设为大于1的数。
当深度大于1,卷积层的计算类似,卷积前图像的深度为D,那么相应的filter的深度也必须为D。相当于之前的计算换成三维的。
下图为包含两个filter的卷积层的计算,filter的深度为3,输入的图像是7*7*3的,zero padding是1,步幅为2,根据公式,W/H=(7-3+2)/2=3。得到的输出是3*3*2的feature map。计算过程如下:
卷积层的计算体现了局部连接和权值共享的思想。
用卷积公式表达卷积层的计算
见https://www.zybuluo.com/hanbingtao/note/485480,卷积操作,互相关操作。
池化层(Pooling)的计算
Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在n*n的样本中取最大值,作为采样后的样本值。还有Average Pooling,取平均值。
池化后的图像大小与池化层大小有关。
池化不改变图像深度,每一层独立的做池化。
卷积网络的训练
训练的原理仍然是链式求导,梯度传播,梯度下降,反向传播。
反向传播算法有三个步骤:
最后根据梯度下降法更新权重。
局部连接、下采样影响了第二步误差的计算,权值共享影响了梯度的计算。
卷积层的训练
关键在于:矩阵的互相关操作
误差项传递的推导和梯度的计算见:https://www.zybuluo.com/hanbingtao/note/485480
池化层的训练
池化层只是传递误差项,没有计算梯度。
max pooling:下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0。
average pooling:下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。
卷积网络的手动实现见:https://www.zybuluo.com/hanbingtao/note/485480