卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 ,通常由输入层、卷积层、池化层、全连接层、输出层结构组成,其中卷积层、池化层、全连接层可能有多层。CNN的结构特性有:
(1)局部连接
在传统的神经网络结构中,神经元之间的连接是全连接的,即n-1层的神经元与n层的所有神经元全部连接。但是在卷积神经网络中,n-1层与n 层的部分神经元连接。
(2)权值共享
每个滤波器与上一层局部连接,同时每个滤波器的所有局部连接都使用同样的权值参数,此举会大大减少网络的参数。
(3)下采样
逐渐降低数据的空间尺寸,减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
CNN的输入层、全连接层、输出层和普通神经网络的没有什么区别,接下将对卷积层和池化层进行介绍。
卷积层用来提取图像特征,一个卷积核提取一种特征。卷积核的参数不同,输入特征图经过和卷积核进行卷积运算后得到的输出特征图就会不同,提取的特征也就不同。卷积层通常使用多个卷积核,提取图像的多种特征,得到的输出特征图的通道数和卷积核的数量一样。
一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。当输入图像为灰度图像时,即为单通道,表示某一像素点颜色的数值只有1个;输入图像为RGB图像时,为多通道(三通道),表示某一像素点颜色的数值有3个。表示图像像素点颜色的数值组成的矩阵可称之为特征图,灰度图像的特征图只有2维,大小为(长,宽),而RGB图像的特征图有3维,大小为(长,宽,通道数),其中通道数就是3。当处理的对象存在多通道数时,使用的卷积核的通道数(第三维大小)也应与待处理对象的通道数大小保持一致。
计算结果如下:
0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43.
输出大小等于输入大小nh×nw减去卷积核大小kh×kw,即:(nh−kh+1)×(nw−kw+1)
阴影部分是第一个输出元素以及用于计算这个输出的输入和核张量元素:(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。
卷积操作常常会导致特征图越来越小。 解决这个问题的简单方法即为填充:在输入图像的边界填充元素(通常填充元素是 0 )。例如,在下图中,我们将3×3输入填充到5×5,那么它的输出就增加为4×4。
阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0×0+0×1+0×2+0×3=0。
通常,如果我们添加ph行填充(大约一半在顶部,一半在底部)和pw列填充(左侧大约一半,右侧一半),则输出形状将为(nh−kh+ph+1)×(nw−kw+pw+1),即输出的高度和宽度将分别增加ph和pw。
在许多情况下,我们需要设置ph=kh−1和pw=kw−1,使输入和输出具有相同的高度和宽度。假设kh是奇数,我们将在高度的两侧填充ph/2行。 如果kh是偶数,则一种可能性是在输入顶部填充⌈ph/2⌉行,在底部填充⌊ph/2⌋行。同理,我们填充宽度的两侧。卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
在进行卷积操作时,卷积窗口从输入张量的左上角开始,向下、向右滑动。 在前面的例子中,我们默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。我们将每次滑动元素的数量称为步幅(stride)。之前我们只使用过高度或宽度为1的步幅,在下图中是垂直步幅为3,水平步幅为2的卷积运算。 着色部分是输出元素以及用于输出计算的输入和内核张量元素:0×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=6。
可以看到,为了计算输出中第一列的第二个元素和第一行的第二个元素,卷积窗口分别向下滑动三行和向右滑动两列。但是,当卷积窗口继续向右滑动两列时,没有输出,因为输入元素无法填充窗口(除非我们添加另一列填充)。
通常,当垂直步幅为sh、水平步幅为sw时,输出形状为⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋。
如果我们设置了ph=kh−1和pw=kw−1,则输出形状将简化为⌊(nh+sh−1)/sh⌋×⌊(nw+sw−1)/sw⌋。 更进一步,如果输入的高度和宽度可以被垂直和水平步幅整除,则输出形状将为(nh/sh)×(nw/sw)。
与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。 然而,不同于卷积层中的输入与卷积核之间的卷积运算,汇聚层不包含参数。 相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大汇聚(maximum pooling)和平均汇聚(average pooling)。
在这两种情况下,与卷积操作一样,汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。
图中的输出张量的高度为2,宽度为2。这四个元素为每个汇聚窗口中的最大值:
max(0,1,3,4)=4,max(1,2,4,5)=5,max(3,4,6,7)=7,max(4,5,7,8)=8.