1962年,Hubel和Wiesel等通过对猫的大脑视觉皮层系统的研究,提出了感受野的概念,并进一步发现了视觉皮层通路中对于信息的分层处理机制,由此获得了诺贝尔生理学或医学奖。
80年代中期,Fukushima等基于感受野概念提出的神经感知机(Neocognitron),可以看作是卷积神经网络的第一次实现,也是第一个基于神经元之间的局部连接性和层次结构组织的人工神经网络。神经认知机是将一个视觉模式分解成许多子模式,通过逐层阶梯式相连的特征平面对这些子模式特征进行处理,使得即使在目标对象产生微小畸变的情况下,模型也具有很好的识别能力。
此后,研究人员开始尝试采用多层感知器(实际上是只含一层隐含层节点的浅层神经网络模型)来代替手工提取特征,并使用简单的随机梯度下降方法来训练该模型,1986年,Rumelhart,Hinton 和Williams 发表了著名的反向传播算法,这一算法随后被证明十分有效。
1990年,Lecun等在研究手写数字识别问题时,首先提出了使用梯度反向传播算法训练的卷积神经网络模型,并在MNIST手写数字数据集上表现出了相对于当时其他方法更好的性能。
卷积神经网络(Convolutional Neural Network, CNN)是一种深层神经网络模型,它的特殊性体现在两个方面
前馈神经网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的。这样设想一下,如果前馈网络中层与层之间的节点连接不再是全连接,而是局部连接的。这样,就是一种最简单的一维卷积网络。如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络
CNN在网络的相邻两层之间使用局部连接来获取图像的局部特性,具体来说,第m层的隐层单元只与第m-1层的局部区域有连接,第m-1层的这些局部区域被称为空间连续的接受域。如下图所示,其每一层接受域的宽度为3:
在CNN中,对整个图像进行一次卷积操作,不同局部区域使用的是同一个卷积核(即权重参数相同),由此生成了一个特征映射(feature map)。通过不同的卷积核对整个图像进行卷积可生成不同的 feature map。下图是一个权值共享的例子:
图中卷积核的接受域是3,同种颜色的连接代表相同的权重值,用一种卷积核进行卷积操作得到一个feature map
通过下图的例子进一步说明CNN的这两个特点:
左边这幅图是全连接网络。如果我们有1000x1000像素的图像,隐含层有1百万个神经元,每个神经元都连接图像的每一个像素点,就有1000x1000x1000000= 1012 个连接,也就有 1012 个权值参数
右边这幅图是局部连接网络,假如卷积核的窗口大小是10×10,隐含层每个神经元只需要和这10×10的局部图像相连接,所以1百万个隐含层神经元就只有1000000×10×10个连接,即 108 个参数,这就是局部连接。
隐含层的每一个神经元都与大小为10×10的图像区域相连接,也就是说每一个神经元存在10×10=100个连接权重参数(卷积核参数)。如果每个神经元的连接权重参数相同,即每个神经元都使用同一个卷积核,这样整个网络就只有100个参数!这就是权值共享!
假如一种卷积核能够提出图像的一种特征,例如某个方向的边缘。如果我们需要提取不同的特征,就需要多使用几种卷积核。如下图所示,使用100种卷积核(不同卷积核的参数都不相同),每种卷积核代表对图像中不同特征的提取。
卷积网络是为识别二维输入而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。 这些良好的性能是网络在有监督方式下学会的,网络的结构主要有局部连接和权值共享两个特点,包括如下形式的约束:
如下图所示,展示了一个3×3的卷积核在5×5的图像上做卷积的过程。左侧的绿色矩阵代表输入的一张图片(例如一张5px*5px的图片),3×3阶的黄色矩阵就是卷积核,用来提取图像的一种特征,让卷积核在图像上进行从左到右,从上到下移动。每移动一次,让卷积核与相应的图像局部区域做点积,就得到了右边矩阵中对应的一个元素。
每个卷积都是一种特征提取方式,通过一种特征提取可得到一个feature map。上图右边的3×3矩阵就是一个feature map,使用不同的卷积核可得到多种feature map
步长(stride)决定了卷积核在移动过程中一次跳过几格。上面那张图片从左到右,每次滑动的时候只移动一格。
tensorflow中卷积的 padding参数可以设为两个值SAME,VALID
VALID模式如上图所示,对原始图像进行卷积,卷积后的矩阵只有3×3阶,比原来的图片要小了
SAME模式要求卷积后的feature map与输入的矩阵大小相同,因此需要对输入矩阵的外层包裹n层0,然后再按照VALID的卷积方法进行卷积。n的求法如下式:
其中,edge_row是包裹0的行数,edge_cols是包裹0的列数 , kernel_row就卷积核的行数
通过将卷积层提取到的特征输入至分类器中进行训练,可以实现输出最终的分类结果。理论上可以直接将卷积层提取到的所有特征输入至分类器中,然而这将需要非常大的计算开销。例如:对于一个输入为96×96大小的图像样本,假设在卷积层使用200个8×8大小的卷积核对该输入图像进行卷积运算操作,每个卷积核都输出一个(96-8+1)×(96-8+1)=7921维的特征向量,最终卷积层将输出一个7921×200=1584200维的特征向量。将如此高维度的特征输入至分类器中进行训练需要耗费非常庞大的计算资源,同时也会产生严重的过拟合问题。
由于图像具有 “静态性”,在图像的一个局部区域得到的特征极有可能在另一个局部区域同样适用。因此,可以对图像的一个局部区域中不同位置的特征进行聚合统计,这种操作称为“池化”(也称作子采样)。池化分为两种,一种是最大池化,在选中区域中找最大的值作为Pooling后的值,另一种是平均值池化,把选中的区域中的平均值作为Pooling后的值。
LeNet-5是一个运用卷积神经网络进行手写数字识别的模型,LeNet-5的展示请参考:LeNet-5, convolutional neural networks
下图展示了LeNet-5的网络结构:
C3 层:这一层是卷积层。由于S2 层也有多组特征映射,需要一个连接表来定义不同层特征映射之间的依赖关系。LeNet-5 的连接表如下图所示,这样的连接机制的基本假设是:C3层的最开始的6 个特征映射依赖于S2层的特征映射的每3 个连续子集。接下来的6 个特征映射依赖于S2 层的特征映射的每4 个连续子集。再接下来的3 个特征映射依赖于S2 层的特征映射的每4 个不连续子集。最后一个特征映射依赖于S2 层的所有特征映射。这样共有60 个滤波器,大小是5 × 5 = 25。得到16 组大小为10×10 = 100 的特征映射。C3层的神经元个数为16×100 = 1, 600。可训练参数个数为(60 × 25 + 16 = 1, 516。连接数为1, 516 × 100 = 151, 600。
S4 层:这一层是一个子采样层,由2×2 邻域点次采样为1 个点,得到16 组5×5 大小的特征映射。可训练参数个数为16 × 2 = 32。连接数为16 × (4 + 1) = 2000。