卷积神经网络 (CNN)
CNN为什么适合图像处理
深度学习的网络中,通常有很多个隐层,每一层的神经元的数量可能很多,如果采用简单粗暴的全连接的方式,当输入是224*224大小的RGB图像时、第一个隐层有1000个神经元时,仅输入和隐层之间的权重就有1.5亿个。这样的神经网络很难训练,即使训练出来也往往会过拟合。
卷积神经网络在某种意义上能够很好地解决上述问题,核心思想包括两点:
- 局部连接:视觉具有很强的局部性,相邻数个点之间很可能构成一个完整的物体,距离越远的两个点之间的联系可能越弱,所以用神经网络做图像处理的时候,一般不需要做全连接,应该充分考虑领域信息,对局部做稠密连接即可。
- 权重共享:CNN使用卷积核(也称为滤波器或者卷积模板)做卷积处理,一张图片中不同的位置可以使用相同的卷积系数(即突触权重)。
基于这两种技术,CNN可以大幅减少处理图像时所需要的权重数量,避免过拟合
CNN的组成
卷积神经网络最重要的层是卷积层(convolution layer),每个卷积层都有一组卷积核来抽取特定的特征,一个卷积核提取一种特征。卷积层的输入、输出的特征图(feature map)尺寸一般变化不大。为了缩小特征图尺寸,一个卷积层后,一般会有一个池化层(pooling layer)。随着不断交替地出现卷积层和池化层,特征图的尺寸随之不断减小,与此同时,抽取出来的特征数量在不断增加。当特征图尺寸较小时,用全连接层(fully-connected layer)将输入神经元和输出神经元全部连接起来。当然在每一个卷积层和每一个全连接层内部,除了向量内积,还需要有激活函数(activation function)。最后,可能还会用到 softmax 函数进行分类概率的凸显、抑制以及归一化。下图给出了卷积神经网络的一般结构。
卷积层
卷积运算
CNN的卷积运算是指对输入子矩阵和卷积核做矩阵内积。
为了提取图像中不同的特征,神经网络需要有多个不同的卷积核。提取出不同的特征后,每一个神经网络层都会输出多个特征图(或者说有多个输出通道),每一个特征图代表一种特征。如果一个网络层的输入是多个特征图(或者说有多个输入通道),这种情况下如何做卷积呢?下图是一个示例。
上面介绍了由输入的3个特征图计算出1个输出特征图的过程。更进一步,如果输入还是3个特征图,而输出是2个特征图,那么卷积核的数量要翻倍,如下图所示。
对于输入图像是RGB的,第一个卷积层的输入便有3个特征图,或者说3个输入通道,即R、G和B。
边界扩充 (padding)
做卷积运算时,如果不做边界扩充,卷积之后的输出尺寸会被动地略微变小。特征图做一次卷积就会缩小,对于一个上百层地神经网络,如果不做边界扩充,将计算不出最后的特征图。
边界扩充的主要目的是保证卷积层的输入特征图和输出特征图尺寸相同,具体手段是在图像四周补上一圈0。此外,边界扩充可以强化图像的边缘信息,因为扩充的点都是0,在卷积中会发挥出比较强的特征提取的作用,而且图像的边缘通常都会有比较重要的特征。
卷积步长
如果希望输出特征图的尺寸有显著变化,可以使用卷积步长(stride)。有些神经网络使用了大于1的卷积步长,在输入特征图上滑动卷积核时,可以一次跳多格,这不但会加快每一层的运算速度,同时也可以快速缩小输出特征图。
选择何种卷积步长,可以根据实际应用需要来调整。如果要保持特征图大小不变,可以做边界扩充。如果要将输出特征图的长宽都减半,可以做边界扩充,同时将卷积步长设为2。
池化层
池化层可以主动缩小图片的尺寸,从而减少参数的数量和计算量,抑制过拟合。池化的方法有很多,例如最大池化(max pooling)、平均池化(average pooling)、 L 2 L^2 L2 池化等。
最大池化是在池化窗口中寻找最大值作为输出,由于其硬件实现简单,因此也是最常用的池化方法。以下图为例,假设池化窗口为 2 × 2 2\times 2 2×2,步长为 2,不做边界扩充,从输入特征图的左上角的 2 × 2 2\times 2 2×2 子矩阵找到最大值 7 作为第 1 个输出,池化窗口在输入特征图上右移 2 格后找到最大值 5 作为第 2 个输出,依此类推。最大池化仅保留池化窗口内特征的最大值,可以提高特征的鲁棒性。
平均池化法在池化窗口内对所有的数取平均值,会把图像的一些特征平均化,也就是模糊化
L 2 L^2 L2 池化则是对池化窗口内所有的数计算出平方和后再开平方。
全连接层
卷积层和池化层构成特征提取器,而全连接层是分类器。全连接层将特征提取得到的高维特征图映射成一维特征向量,该特征向量包含所有特征信息,可以转化为最终分类为各个类别的概率。
例如,1 个 224 × 224 224 \times 224 224×224 大小的输入图片经过多层卷积和池化,最终变成了 4096 4096 4096 个 2 × 2 2\times 2 2×2 大小的特征图,经过全连接层后变成了 1 × 5 1\times 5 1×5 的一维特征向量,这是如何做到的呢?其实全连接层可以理解为一种特殊的卷积层,但卷积核的大小应该和特征图大小一致,由于输入大小为 2 × 2 × 4096 2\times 2 \times 4096 2×2×4096,因此一个卷积核大小应该为 2 × 2 × 4096 2\times2 \times 4096 2×2×4096,一个卷积核做一次卷积后就可以得到一个输出,由于最终结果是 1 × 5 1\times 5 1×5,因此需要 5 个这样的卷积核。最终得到的一维特征向量具有 5 个值,分别对应输入图片是猪狗猫牛羊的 “概率”(全连接层的输出并不是真的概率,还需要进行归一化)。
softmax 层
有些 CNN 的最终输出是由全连接层决定,也有的 CNN 是用 softmax 层做最终输出。softmax 层只是对全连接层的输出进行了归一化,输出分类概率,其计算过程为
f ( z j ) = e z j ∑ i = 0 n e z i f(z_j)=\frac{e^{z_j}}{\sum_{i=0}^{n}e^{z_i}} f(zj)=∑i=0neziezj
其中, z j z_j zj 是 softmax 层的第 j j j 个输入。通过 softmax 层的归一化,可以凸显较大的值并抑制较小的值,从而显著抑制次要特征,决定分类概率。
激活函数
激活函数可以为神经网络提供非线性特征,使得神经网络可以解决非线性问题。在卷积层或者全连接层中,卷积的结果并不是直接作为输出,还需要将其输入给激活函数,激活函数的输出才是最终的输出。常用的激活函数有 sigmoid、tanh、ReLU等。