卷积神经网络是第一个被成功训练的多层神经网络结构,具有较强的容错、自学习及并行处理能力。

一、基本原理

1.CNN算法思想

卷积神经网络可以看作为前馈网络的特例,主要在网络结构上对前馈网络进行简化和改进,从理论上讲,反向传播算法可以用于训练卷积神经网络。卷积神经网络被广泛用于语音识别和图像分类等问题。

2.CNN网络结构

卷积神经网络是一种多层前馈网络,每层由多个二维平面组成。每个平面由多个神经元组成。

网络输入为二维视觉模式,作为网络中间层的卷积层(C)和抽样层(S)交替出现。网络输出层为前馈网络的全连接方式,输出层的维数在分类任务中的类别数。

2.1 输入层

卷积神经网络的输入层直接接收二维视觉模式,如二维图像。可以不再需要额外的人工参与过程去选择或者设计合适特征作为输入,自动地从原始图像数据提取特征、学习分类器,可大大减少人工预处理过程,有助于学习与当前分类任务最为有效的视觉特征。

为了显示清楚,上图中的输入层只绘制一个二维视觉模式,即对应一幅灰度图像。在实际应用时,输入层可为多通道图像,如三通道彩色图像,或者图像序列,如视频中的连续多帧图像。

2.2 卷积层(C)层

卷积层属于中间层,为特征抽取层。每个卷积层中包含多个卷积神经元(C)元,每个C元只和前一层网络对应位置的局部感受域相连,并提取该部分的图像特征,具体提取的特征体现在该C元与前一层局部感受域的连接权重之上。相对于一般的前馈网络,卷积神经网络的局部连接方式大大减少了网络参数。

为了进一步减少网络参数,卷积神经网络同时限制同一个卷积层不同的神经元与前一层网络不同位置相连的权重均相等,即一个卷积层只用来提取前一层网络中不同位置处的同一种特征,这种限制策略称为权值共享,该假设源于图像处理的实际经验:如果一种特征在图像中的某个位置很有效,那么在图像的其他位置也可能很有效。通过设计这种权值共享连接方式,不仅可进一步减少网络参数,而且也可促进网络学习与位置无关的鲁棒视觉特征用于分类,就是最终学到的某个特征无论出现在图像什么位置,网络总能抽取到该特征并将其用于分类。

通过设计多个卷积层,网络可以抽取多个不同特征用于最终的分类任务。

如图2所示,该卷积层的局部感受域大小为5X5,使用黄色和红色标注一层卷积层上两个卷积神经元与前一层网络的对应关系,每一个卷积神经元与前一层网络的联接权重的数目为5X5.

2.3 抽样层(S)层

抽样层属于中间层,为特征映射层。每个抽样层包含多个抽样神经元(S)元,S元仅与前一层网络对应位置的局部感受域相连。与C元不同,每个S元与前一层网络局部感受域连接的所有权重都固定为特定值,在网络训练过程中不再进行改变。

当前C层网络不仅不再产生新的训练参数,而且对前一层网络抽样得到特征进行下采样,进一步降低了网络规模。通过对前层网络局部感受域的下采样,使网络对于输入模式潜在的形变更为鲁棒。

如图3所示,该抽样层前层网络的局部感受域大小设置为2X2,经过抽样层,前层网络抽取特征维数减为原来的1/4.

2.4 输出层

卷积神经网络的输出层与常见前馈网络一样,为全连接方式。最后一层隐层(可为C层或S层)所得到二维特征模式被拉伸为一个向量,与输出层以全连接方式相连。

该结构可充分挖掘网络最后抽取特征与输出类别标签之间的迎神关系,在复杂应用中,输出层可以设计多层全连接结构。

2.5 CNN结构示例

全集神经网络通过结构上的局部连接、权值共享、下采样等,不仅可很好地控制整个网络规模,而且可实现网络对识别图像在位移、缩放和扭曲等形变的鲁棒性。

对于只包含一层中间层的某前馈网络,假设输入为1000x1000px的图像,隐层神经元的数目为100万,输出类别数为10,那么如果网络为全连接结构,网络参数为1000x1000x1000000+1000000x10≈1012.

如果采用局部连接结构,并且假设局部感受域的大小为10x10,那么每个隐层神经元只需要和这10x10的局部图像相连接,网络参数10x10x1000000+1000000x10≈108,网络参数下降约4个数量级。

如果进一步采用权值共享,即100万个隐层神经元与前一层局部感受域的权重都相等,那么网络参数为10x10+1000000x10≈107,网络参数进一步下降一个数量级。

如果通过抽样层下采样,假设抽样层的局部感受域大小为10x10,那么网络参数为10x10+10000x10≈105,网络参数下降两个数量级。

卷积神经网络通过结构上的约束和设计可以大大减少网路参数,从结构本身实现一定的正则化,使网络训练过程相对较容易、不易过学习。使网络权重减少的结构限制都针对输入模式在平移、缩放及扭曲等形变上的不变性,训练出来的网络对于这些形变具备更好的鲁棒性。

3、CNN网络学习

卷积神经网络从整体上属于前馈网络,在理论上用于训练前馈网络的反向传播算法可以用来训练卷积神经网络。卷积神经网络在结构上存在特殊性,为了高效训练卷积神经网络,需要对反向传播算法进行优化。

3.1 反向传播算法

假设用于网络训练的样本集合为{xn,tn}n=1N,输入特征和目标类别的维数分别为ni和n0。以平方和误差为损失函数,网络在整个训练集合上的训练误差表示为如下:

这里yn表示网络以xn为输入时的输出。网络 在整个训练集合上的训练误差为所有样本的误差和,那么网络在一个训练样本上的训练误差可以表示为:

反向传播算法训练过程主要包括前向计算过程和反向更新过程。对于普通的全连接前馈网络,前向计算过程逐层计算输入x经过每一层网络的输出如下:

al=δ(zl)   zl=Wlal-1+bl

这里al表示输入经过第l层神经元计算节点后的结果,δ(·)表示神经元计算节点的激活函数,zl表示第l层神经元的总输入。对于输入层al=x,对于输出层有anl=y。在得到样本经过经过网络的输出后,就可以计算网络对于该样本的训练误差。

在反向更新过程中,训练误差相对于网络参数的导数被从后向前逐层进行传播,训练误差相对于任意层偏置项b的导数为:

这里引入变量δ表示训练误差相对于偏置项b的导数,其物理意义是训练误差相对于偏置项的变化率,即导数,可以称之为灵敏度。对于输出层,该变量对应的值为:

δnl-1=δ`(unl-1)·(yn-tn)

对于中间层l(1<l<nl-1),该变量对应的值为:δl=(Wl+1)Tδl+1·δ`(ul)

根据每一层中改变的具体值,训练误差相对于该层联接权重Wl的导数为:

3.2 适用于CNN的BP算法

使用BP算法训练卷积神经网络的过程和普通前馈网络一样,分为前向计算和反向更新过程。卷积神经网络在结构上交替出现卷积层和抽样层,最后一层或几层为全连接层。对于全连接层。对于全连接层,其前向计算、反向更新过程与普通前馈网络一样。

(1)卷积层

卷积层的输入为前一层网络的多个二维特征图,卷积层将它们与多个可学习的卷积核(局部连接、权值共享的权重矩阵)进行卷积,然后将卷积结果通过神经元计算节点得到卷积层的输出二维特征图。每一个输出特征图融合与多个输入特征图的卷积结果。卷积层的前向计算过程可以表示为:

这里Mjl表示第l层第j个输出特征图所对应的多个输入特征图的索引集合,符号“*”代表卷积操作,所有Mj中的输入特征图都共用一个偏置项bjl.

根据基本的BP算法推导如何计算卷积层的梯度。

假设卷积层l的下一层为抽样层l+1.BP算法表明,为了计算l层的每个神经元对应的权值更新,需要计算l层的灵敏度δl.为了求l层的灵敏度,需要先对l+1层对应节点的灵敏度求和(对应节点指连接到l层的感兴趣节点的第l+1层的那些节点),然后乘以它们之间联接的权重,最后再乘以l层该神经节点的输入u经过激活函数的导数值,就得到l层每个神经元节点对应的灵敏度δl 。然而由于抽样层下采样的原因,抽样层每一个像素(神经元节点)对应的灵敏度δl+1对应于卷积层输出特征图的一块像素(即采样窗口),因此卷积层l的一个输出特征图中的每个节点只与抽样层l+1中响应特征图的一个节点相连。为了高效计算卷积层l的灵敏度,可以上采样这个经过抽样层下采样的灵敏度图(特征图的每个像素都对应一个灵敏度,构成一个灵敏度图),使得到的上采样灵敏度图的大小与卷积层的灵敏度图大小一致,然后将卷积层l的激活值的导数与上采样灵敏度图进行点积操作即可。由于抽样层的下采样因子均为一个常数值β,所以最后只要对点积后的特征图乘以这个常数即可。需要对卷积层的每一个特征图和它在抽样层对应的灵敏度图都重复上述过程。这个过程表示为:

这里up(·)表示上采样操作,如果下采样因子是n的话,只要简单地在每个像素水平和垂直方向上重复n次即可。实际上,这个函数可以使用Kronecker乘积⊗来定义:

up(x)x⊗lnxn

对于卷积层每一个特征图,可以计算灵敏度图。通过对卷积层的灵敏度图的所有节点进行求和,计算训练误差关于偏置的梯度:

由于很多连接权值是共享的,因此对于一个给定权重,需要对所有与该权值有联系的连接对该点求梯度,然后再对这些梯度求和。

(2)抽样层

抽样层对于输入的每个特征图产生一个下采样的特征图,如果有N个输入特征图,就有N个输出特征图,只是每个输出特征图变小了。抽样层可表示为:

down(·)表示下采样函数,该函数对输入图中每个不重复nxn的图像块求和后得到输出图中的一个点值,输出图的长和宽均为输入图的1/n。每个输出有一个特定的乘性偏置β和加性偏置b。

只要得到抽样层的灵敏度图,就可以计算关于偏置参数β和b的梯度。对于下一层为全连接层的抽样层,其灵敏度图可以直接使用标准BP算法进行计算。

若抽样层的下一层为卷积层,为了计算下一层卷积核的梯度,需要找出抽样层中哪个图像块与卷积层的灵敏度图中一个给定像素相对应。由于连接输入图像块与输出像素之间权重系数实际上就是卷积核的权重(旋转后),抽样层和卷积层灵敏度图之间的关系可以利用卷积操作高效地实现:

在MATLAB中,使用full类型的卷积操作可以自动对图像边界进行填零处理。根据抽样层的灵敏度图,训练误差相对于加性偏置bj的梯度可以通过对敏感图上的元素进行求和得到:

而训练误差相对于乘性偏置βj的梯度,由于涉及到该层在前向计算过程中得到的下采样后最初的特征图,可以在前向计算中将下采样后的特征图保存起来,可以使用djl表示对前一层输出特征图下采样后得到的特征图,即:djl=down(ajl-1)

那么训练误差相对于乘性偏置βj的梯度可以由下式得到:

根据卷积神经网络每一层的具体结构特点,选择对应计算公式得到训练误差相对于训练参数的梯度,就可以对网络参数进行更新。

 二、算法改进

卷积神经网络训练过程收敛很慢且耗时。研究者提出了很多提高卷积神经网络运算效率的方法。

1、设计新的卷积神经网络训练策略

目前卷积神经网络的训练是利用BP算法以整体监督方式进行学习的,通过采用某种方式的预训练(监督式或无监督式),可以为卷积神经网络提供一个较好的初始值,从而大大提高其整体上使用BP算法进行训练的收敛速度。

2、使用GPU加速卷积运算过程

基于GPU运算,通过撰写高效C++代码实现卷积操作,可以将卷积操作速度提高3~10倍。

3、使用并行计算提高网络训练和测试速度

将一个大的卷积神经网络划分为几个小的子网络,再并行处理每个子网络中的运算过程,可以有效改善整个大网络的运算过程。

4、采用分布式计算提高网络训练和测试速度

该加速方式使用成千上万个运算节点,每个运算节点值完成整个网络计算中的很小一部分计算,通过调度节点为每个运算节点分配相应的计算任务,每个运算节点分别完成各自的计算任务,所有计算节点的计算任务都完成之后,调度节点再将每个计算节点的计算结果汇总融合。

采用该加速方式,速度提高非常明显,可以完成一些以前几乎不能完成的网络训练任务,但主要问题是相关程序编制较为复杂,需要额外消耗较多的计算资源。

5、硬件化卷积神经网络

卷积神经网络成功应用于越来越多的实际问题之中,卷积神经网络中的卷积层和下采样层如果能够被硬件化,将会再次提高卷积神经网络的运行效率。

三、仿真实验

首先给出CNN训练的算法仿真,然后介绍卷积神经网络的两个著名实例,详细说明CNN在实际应用中网络结构的具体形式。

1、卷积神经网络训练算法仿真

算法1:基于BP算法的卷积神经网络训练算法

输入:训练样本{xn,tn}n=1N,卷积神经网络的结构{hl}l=1L,学习速率η

输出:卷积神经网络的参数

训练过程:

初始化:设置卷积网络的所有层的卷积核和偏置项为较小的随机值;

While not converged

从训练样本集合中采样样本(xn,tn

前向计算过程:

For l=1:L

如果hl为卷积层:

如果hl为下采样层:

如果hl为全连接层:al=δ(zl),其中zl=Wlal-1+bl

End For


                     反向传播过程:

For l=L:1

如果hl为卷积层:

如果hl为下采样层:

如果hl为全连接层:

End For

更新参数:

End While

2、卷积神经网络实际应用实例

(1)Yann LeCun开发的LeNet所用的卷积神经网络

基于LeNet的手写数字分类系统在商业上取得极大成功,网络上有LeNet5的在线演示,对于各种复杂的手写数字都能够准确识别。

如图4所示,LeNet5的网络输入层由32x32的感知节点组成,每一个感知节点用来接收输入32x32灰度图像的一个像素。

网络的第一个隐层为卷积层,卷积核的数目为6,卷积核的大小(即局部感受域的大小)为5x5,输入层经过第一卷积层,输入图像被卷积成6个28x28的特征图,特征图的大小由输入特征图的32x32变成输出的28x28,卷积采用了valid方式,即输出特征图的大小=输入特征图的大小-(卷积核的大小-1)

网络的第二个隐层为抽样层,其局部感受域大小为2x2,即每一个2x2的像素被下采样为1个像素,经过第二层隐层后,特征图的大小变为14x14,特征图的数目不变,仍未6个。

网络的第三个隐层为卷积层,卷积核的数目为16个,卷积核的大小为5x5,所以经过该层输出的特征图大小为10x10(10=14-5+1)。需要注意的是,该层输入的6个特征图,变成输出的16个特征图,这个过程可以看作是将S2的特征图用1个输入层为150(=5x5x6,而不是5x5)个节点。

网络的输出层为16个节点的网络进行卷积,并且C3的每个特征图并不是和S2的每个特征图都相连,而是可能只和其中几个进行相连。

LeNet5的具体连接关系如图5所示,纵坐标表示输入特征图索引,横坐标表示输出特征图索引,有X标记的位置表示该位置对应的输入特征图与输出特征图之间存在连接。

网络的第四个隐层S4为下采样层,局部感受域的大小为2x2,该层输入16个5x5的特征图。

网络的第五个隐层是卷积层,它是最后一个卷积层,卷积核的大小为5x5,卷积核的数目为6,在卷积操作完成之后,C5将得到的特征图展开成一个向量,向量的大小为120(=20x6).

网络的第六个隐层F6为一个全连接网络,节点数为84,这84个节点与C5的120个输入节点完全连接。

网络的输出层节点数目为10,表示对应问题的分类数目(0~9共10个数字).

(2)Geoffrey Hinton的ILSVRC2013竞赛所用的卷积神经网络

基于该网络的图像分类算法,取得了ImageNet ILSVRC2013的第一名,分类结果得到极大提高,是卷积神经网络在计算机视觉问题的一个里程碑工作。

如图6所示,相比于LeNet5,该网络结构更为复杂,输入为224x224x3的彩色图像。

网络的每个卷积层和抽样层将输入特征图分为两部分,实现并行处理,第一个隐层的卷积核数目为96,分为上下各48个卷积核,卷积时每隔4像素进行卷积,卷积层输出的特征图维数大大减少。

网络的抽样层没有选用LeNet5使用的均值下采样(mean polling),而采用了最大值下采样(Max polling)。

在最后的两个隐层中都选择全连接网络,可以学习出经过卷积层和抽样层学习到的特征与输出的更为复杂的关系。

网络的输出层维数为1000维,表示将输入图像最终分为1000类。

四、算法特点

1、算法优点

卷积神经网络是第一个被成功训练的包含多层结构的神经网络,相对于其他神经网络有着非常明显的优势。

第一,卷积神经网络的结构设计受启发于神经学家关于视觉神经机制的研究成果,具有较为可靠的生物学依据。

第二,卷积神经网络能够直接从原始输入数据中自动学习相应特征,省去一般机器学习算法所需要的特征设计过程,节省大量时间,能够学习和发现更为有效的特征。

第三,卷积神经网络的结构本身实现一定形式的正则化,训练参数被控制在一个很小的数量级上,整个网络不仅更容易训练,而且最终网络也具备非常好的推广性能。

第四,卷积神经网络的结构特点使得网络对于输入的噪声、形变和扭曲等变化的适应性非常强。

早期卷积神经网络用于处理二维图像,目前卷积神经网络广泛用于处理一维声音信号、三维图像序列或者视频信号等,扩展能力强。

2、算法缺点

卷积神经网络存在着明显的缺点。

第一,由于在结构上的限制性,卷积神经网络在网络记忆能力和表达能力上远远弱于对应的全连接网络。

第二,由于卷积操作原因,在训练、测试时运行效率都非常低,运算过程非常耗时,比其对应的全连接网络慢近三倍。

第三,在结构设计上没有通用的理论和方法指导,要想设出有效的卷积神经网络结构,需要花费大量时间。

视觉机器学习笔记------CNN学习的更多相关文章

  1. Python机器学习笔记 集成学习总结

    集成学习(Ensemble  learning)是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合,从而获得比单个学习器显著优越的泛化性能.它不是一种单独的机器学习算法啊,而更像是一种优 ...

  2. Stanford机器学习笔记-6. 学习模型的评估和选择

    6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...

  3. CNN学习笔记:池化层

    CNN学习笔记:池化层 池化 池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样.有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见 ...

  4. CNN学习笔记:线性回归

    CNN学习笔记:Logistic回归 线性回归 二分类问题 Logistic回归是一个用于二分分类的算法,比如我们有一张图片,判断其是否为一张猫图,为猫输出1,否则输出0. 基本术语 进行机器学习,首 ...

  5. CNN学习笔记:正则化缓解过拟合

    CNN学习笔记:正则化缓解过拟合 过拟合现象 在下图中,虽然绿线完美的匹配训练数据,但太过依赖,并且与黑线相比,对于新的测试数据上会具有更高的错误率.虽然这个模型在训练数据集上的正确率很高,但这个模型 ...

  6. Python机器学习笔记:sklearn库的学习

    网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档. 官方文档地址:https://scikit-learn.org/stable/ (可是官方文档非常 ...

  7. 卷积神经网络(CNN)学习笔记1:基础入门

    卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Vie ...

  8. CNN学习笔记:批标准化

    CNN学习笔记:批标准化 Batch Normalization Batch Normalization, 批标准化, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法. 在神经网络的训练过 ...

  9. CNN学习笔记:目标函数

    CNN学习笔记:目标函数 分类任务中的目标函数 目标函数,亦称损失函数或代价函数,是整个网络模型的指挥棒,通过样本的预测结果与真实标记产生的误差来反向传播指导网络参数学习和表示学习. 假设某分类任务共 ...

随机推荐

  1. linux编程问题记录

    1.程序中需要用到字符串的时候,尽可能选择string类型,这种类型的字符串有很多比较容易的功能,如字符串之间可以直接拷贝赋值 string a; string b="123"; ...

  2. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

  3. struts2学习记录

    1.对于使用Struts2框架的应用而言,尽量不要让超级链接直接接到某个视图资源,因为这种方式增加了额外的风险.推荐将所有请求都发送给Struts框架,让该框架来处理用户请求,即使只是简单的超级链接. ...

  4. 大公司的PHP面试题

    1. 禁用COOKIE 后 SEESION 还能用吗? 2. 抓取远程图片到本地,你会用什么函数? 4. 你觉得在pV10W的时候, 同等配置下,LUNIX 比WIN快多少? 5. 简述pOST 和G ...

  5. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  6. Pyqt adb 获取Android手机屏幕

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...

  7. 【转】一台电脑同时运行多个tomcat配置方法

    参考:http://blog.csdn.net/zyk906705975/article/details/8471475

  8. 【转】hibernate缓存:一级缓存和二级缓存

    什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行 ...

  9. svn在linux上的安装

    什么是svnSVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subv ...

  10. jQuery插件(cookie存值)

    使用cookie插件后,可以很方便地通过cookie对象保存.读取.删除用户的信息,还能通过cookie插件保存用户的浏览记录,它的调用格式为: 保存:$.cookie(key,value):读取:$ ...