从前面的学习中,我们了解了DNN的一般结构、前向传播和反向传播机制,而CNN相较于DNN,其主要区别在于卷积层(Convolutional Layer),卷积层的存在使得神经网络具备更强的学习和特征提取能力。除卷积层之外,池化层(Pooling Layer)的存在也使得CNN有着更强的稳定性,最后则是DNN中常见的全连接层(Fully Connected Layer),全连接层可以起到分类器的作用。一个典型的CNN通常包括这三层。CNN的基本结构如图4.4所示。
图4.4 CNN的基本结构
介绍了这么多CNN的知识,想必很多人还没弄明白到底什么是卷积?
从数学的角度来看,卷积可以理解为一种类似于加权运算的操作。在图像处理中,针对图像的像素矩阵,卷积操作就是用一个卷积核来逐行逐列的扫描像素矩阵,并与像素矩阵做元素相乘,以此得到新的像素矩阵,这个过程就是卷积。其中卷积核也叫作过滤器或滤波器,滤波器在输入像素矩阵上扫过的面积称为感受野。这么说可能过于概念化,下面以一个具体的例子来介绍卷积操作,如图4.5所示。
图4.5 卷积操作
在图4.5中,用一个3*3的滤波器扫描一个5*5的像素矩阵,用滤波器中每一个元素与像素矩阵中感受野内的元素进行乘积运算,可得到一个3*3的输出像素矩阵,这个输出的3*3像素矩阵能够较大程度地提取原始像素矩阵的图像特征,这也是卷积神经网络之所以有效的原因。下面以输出像素矩阵中第一个元素4为例,演示一下计算过程:
1*1+1*0+1*1+1*0+1*1+0*0+1*1+0*0+0*1=4
这里你可能会问,如何确定经过卷积后的输出矩阵的维度?这是有计算公式的。假设原始输入像素矩阵的shape为n*n,滤波器的shape为f*f,那么输出像素矩阵的shape为(n-f+1)*(n-f+1)。例如,用3*3的滤波器扫描一个5*5的输入图像,按照公式计算输出就是(5-3+1)*(5-3+1)=3*3。在训练卷积网络时,需要初始化滤波器中的卷积参数,在训练中不断迭代得到最好的滤波器参数。
大体上卷积操作就是这么个过程,看起来十分简单。这也是目前大多数深度学习教程对于卷积的阐述方式。下面再来深究一下,究竟卷积为什么要这么设计,背后有没有什么数学和物理意义呢?追本溯源,先回到数学教科书中来看卷积。在泛函分析中,卷积也叫作旋积或褶积,是一种通过两个函数x(t)和h(t)生成的数学算子。其计算公式如下。
公式写得很清楚了,两个函数的卷积就是先将一个函数进行翻转(Reverse),然后再做一个平移(Shift),这便是“卷”的含义;而“积”就是将平移后的两个函数对应元素相乘求和。所以,卷积本质上就是一个翻转平移加权求和(Reverse-Shift-Weighted Summation)的操作。那么为什么要卷积?直接元素相乘不行吗?就图像的卷积操作而言,卷积能够更好地提取区域特征,使用不同大小的卷积算子能够提取图像各个尺度的特征,卷积这么设计的原因也正在于此。
接着前面的卷积图像处理操作,这里需要注意两个问题:第一个问题是滤波器移动的步长(Stride)问题,上面例子中滤波器的移动步长为1,即在像素矩阵上一格一格地平移。但如果滤波器是以两个单位或更多单位平移呢?这里就涉及卷积过程中的Stride问题。第二个问题涉及卷积操作的两个缺点,第一个缺点在于每次做卷积,图像就会变小,可能做了几次卷积之后,图像就变成1*1了;第二个缺点在于原始输入像素矩阵的边缘和角落的像素点只能被滤波器扫到一次,而靠近像素中心点的像素点则会被多次扫到进行卷积,从而使得边缘和角落里的像素特征提取不足,这里就涉及卷积过程中的填充(Padding)问题。
针对第一个问题,也就是卷积步长问题,其实也很简单,就是按照正常的卷积过程去操作,只不过每次要多走一个像素单位。下面来看卷积步长为2的卷积操作示例,如图4.6所示。
图4.6 卷积步长为2的卷积操作示例
这里用一个3*3的滤波器去对原始像素为7*7的图像进行卷积操作,设定卷积步长为2,可以看到输出像素矩阵的第二行第一个元素69的计算跨越了两个像素格点,计算过程如下。
3*3+4*4+8*4+7*1+8*0+3*2+4*-1+2*0+1*3=69
加入步长之后,输出像素矩阵的shape计算公式需要更新为((n-f)/s+1)*((n-f)/s+1),其中s为步长。
针对第二个问题,卷积神经网络采用一种叫作Padding的操作,即对原始像素边缘和角落进行零填充,以期能够在卷积过程中充分利用边缘和角落的像素特征。至于选择填充多少像素,一般有两个选择,一个是Valid填充,也就是不填充;另一个是Same填充,即填充后,输入和输出大小是一致的,对于n*n大小的输入像素,如果填充了p个像素点之后,n就变成了n+2p,最后输出像素的shape计算公式就变成了((n+2p-f)/s+1)*((n+2p-f)/s+1),要想让n+2p-f+1=n,即输入和输出大小相等,则p=(f-1)/2。所以,在正常情况下滤波器的大小f都会选择为奇数。
以上便是CNN中卷积的基本过程描述。一个完整的卷积神经网络除最重要的卷积层之外,还有池化层和全连接层。