卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络, 在计算机视觉等领域被广泛应用. 本文将简单介绍其原理并分析Tensorflow官方提供的示例.
关于神经网络与误差反向传播的原理可以参考作者的另一篇博文BP神经网络与Python实现.
工作原理
卷积是图像处理中一种基本方法. 卷积核是一个nxn的矩阵通常n取奇数, 这样矩阵就有了中心点和半径的概念.
对图像中每个点取以其为中心的n阶方阵, 将该方阵与卷积核中对应位置的值相乘, 并用它们的和作为结果矩阵中对应点的值.
下面的动图展示了卷积的计算过程:
上述操作处理图像得到新图像的操作称为卷积, 卷积得到的结果矩阵被称为特征图(Feature Map). 灰度图使用一个矩阵便能表示, RGB图像则需要3个矩阵. 也就是说, 1个RGB图像使用一个卷积核卷积会得到3个Feature Map.
若卷积核中各元素和为1则图像亮度不变, 若小于1则变暗, 大于1则会变亮.
卷积核的中心无法对准原图像中边缘的像素点(与边缘距离小于卷积核半径), 若要对边缘的点进行计算必须填充(padding)外部缺少的点使卷积核的中心可以对准它们. 常用的填充策略有:
- 使用中心点的值代替缺失的点
- 使用中心点邻域的均值代替缺失的点
- 填充为0
特殊的卷积核可以实现特殊的效果:
-
锐化
−1−1−1−19−1−1−1−1 -
提取边缘
−1−1−1−18−1−1−1−1
- 浮雕
−2000−100−10
下面四张图片分别为:
- A: 原图
- B: 锐化
- C: 边缘检测
- D: 浮雕
局部感知
一般认为人的视觉认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱.
同理, 每个神经元其实没有必要对全局图像进行感知, 只需要与局部图像建立连接. 在网络的更深层将神经元的局部感知进一步综合就可以了解到全局信息.
采用局部感知的方法减少了需要训练的权值数. 在实际应用中图像的分辨率和训练迭代次数都是有限的, 更少的权值数通常会带来更高精度.
权值共享
在卷积神经网络中对于同一个卷积核, 所有卷积层神经元和图像输入层的连接使用同一个权值矩阵.
权值共享进一步减少了所需训练的权值数, 一个卷积层的权值数变为了卷积核中元素个数.
权值共享隐含的原理是: 图像的一部分的统计特性与其他部分是一样的, 在图像某一部分学习到的特征也能应用到其它部分上.
从上文关于特殊卷积核的描述中可以得知, 一种卷积核通常只能提取图像中的一种特征. 且权值共享使得连接可以训练的权值数大为减少. 为了充分提取特征通常采用使用多个卷积核的方法.
池化
通过卷积学习到的图像特征仍然数量巨大, 不便直接进行分类. 池化层便用于减少特征数量.
池化操作非常简单, 比如我们使用一个卷积核对一张图片进行过滤得到一个8x8的方阵, 我们可以将方阵划分为16个2x2方阵, 每个小方阵称为邻域.
用16个小方阵的均值组成一个4x4方阵便是均值池化, 类似地还有最大值池化等操作. 均值池化对保留背景等特征较好, 最大值池化对纹理提取更好.
随机池化则是根据像素点数值大小赋予概率(权值), 然后按其加权求和.