• 卷积神经网络的学习


    一 卷积神经网络的概述     

    我们知道BP网络的每一层的神经元与上一层,以及它的下一层都是全连接的,那么,我们假设每一层的神经元与上一层的神经元只有部分连接(局部连接,涉及到动物视觉中感受野概念),这就构成了我们要说的卷积神经网络结构。当然,也有人说BP网络是卷积神经网络的特例,每一层的神经元采取全连接的方式连接。

    BP网络和卷积神经网络的一个神经元与上一层的连接情况,就像下面这样:

    图1

    卷积神经网络的特殊性在于:

    (1)每一层的神经元之间的是非全连接的方式 (2)同一层的某些神经元采取的是权值共享的方式,即神经元的权重和偏置相同

    这样的好处是降低了网络模型的复杂度(对于很难学习的深层结构来说,这是非常重要的),减少了权值的数量。

    卷积神经网络的结构

    卷积神经网络的结构是为识别二维形状而特殊设计的多层感知器,这种网络结构对于平移,比例缩放,倾斜等其他形式的变形具有高度不变性。这些都是网络的在有监督的条件下学习得到的。卷积神经网络是一个多层的神经网络,每一层由多个二维平面组成,每个平面由多个神经元组成,

    图2

    图2中,输入图像,通过三个可训练的滤波器(可加偏置项,如图3)进行卷积,卷积后在C1层产生三个特征映射图;然后,C1中每个特征映射图的每组像素(一般为2*2)进行求和,加权重项,再加偏置项(见图3),通过sigmoid激活函数,分别得到S2相应的三个特征映射图;C3层再以S2层作为输入,通过滤波器对S2层的特征映射图进行卷积,加偏置项得到C3,然后,由通过S2同样的方式得到C3层每个特征图对应的映射图,即得到S4;最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。

    图3

    一般地,C层为特征提取层,每个神经元的输入与上一层的局部感受野相连接,并提取该局部的特征,一旦该局部的特征被提取后,它与其他特征间的相对位置关系随之确定下来。S层是特征映射层(子抽样层),网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有的神经元的权值相等。特征映射结构采用影响核函数较小的sigmoid函数作为卷及网络的激活函数,使得特征映射具有位移不变性。

    此外,由于映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络的每一个特征提取层(C层)都跟随者一个用来求局部平均(或局部最大)和二次提取的计算层(S层),这种特有的两次特征提取结构使网路在识别时,对输入的样本具有较高的畸变容忍能力。

    下面,再来讨论一下,卷积神经网络的两大特征,稀疏连接和权值共享:

    (1)稀疏连接

    卷积网络通过在相邻两层之间强制使用局部连接模式,来利用图像空间的局部特性,在第m层的隐层单元只与第m-1层的输入单元的局部区域有连接,第m-1层的这些局部区域被称为空间连续的接受域。可以将这些结构描述如下,

    设第m-1层为视网膜输入层,第m层的接受域的宽度为3,也就是说该层的每个单元与且仅与输入层的3个相邻的神经元相连,第m层和第m+1层具有类似的链接结构,如下所示:

    可以看到m+1层的神经元相对于第m层的接受域的宽度也为3,但相对于输入层的接受域为5,这种结构将学习到的过滤器(对应于输入信号中被最大激活的单元)限制在局部空间 模式(因为每个单元对它接受域外的variation不做反应)。从上图也可以看出,多个这样的层堆叠起来后,会使得过滤器(不再是线性的)逐渐成为全局的(也就是覆盖到了更 大的视觉区域)。例如上图中第m+1层的神经元可以对宽度为5的输入进行一个非线性的特征编码。

    (2)权值共享

    在卷积网络中,每个系数过滤器通过共享权值覆盖整个可视域,这些共享权值的单元构成一个特征映射,如下所示:

    在图中,有3个隐层单元,它们属于同一特征映射,同种颜色的连接权值是相等的,我们仍然可以通过梯度下降的方法来学习这些权值,只需要对原始算法做一些小的改动,这里共享权值的梯度是所有共享参数的梯度的总和。为什么要权值共享呢,一方面,重复单元可以对特征进行识别,而不考虑它在可视域的位置;另一方面,权值共享能更有效的进行特征提取,因为它极大地减少了要学习的自由变量的个数。通过控制模型的规模,卷及网络对视觉问题可以具有很好的泛化能力。

    关于卷积神经网络结构的一个例子,LeNet-5模型结构,可以参见这篇博文,且本文上述内容的概念思想也是来源于该文:http://blog.csdn.net/zouxy09/article/details/8781543

    三 卷积神经网络的逐层结构分析

    他山之石,可以攻玉,关于卷积神经网络的逐层结构分析,大家可以参见这篇博文,是以LeNet为例,从代码的角度逐层分析各项参数,看完这篇博文,相信对于卷积神经网络会有更加深入的了解,http://www.2cto.com/kf/201606/518254.html

    卷积神经网络的训练

     训练算法和传统的BP算法差不多,主要有四步(被分为两个阶段):

    第一阶段(向前传播阶段):

    a)初始化模型参数,通过随机产生一些不同的值较小的随机数,小随机数用来保证网络不会因为权值过大而进入饱和状态,从而导致训练失败。不同用来保证网络可以正常的学习,实际上,如果用相同的数来初始化权重矩阵,网络几乎没有学习能力。

    b)取样本(x,y)将x输入到网络

    c)计算相应的实际输出o:在此阶段,数据从输入层经过朱层的额变换,传到输出层。在此过程中,网络执行的是计算过程,实际上就是输入和每层的权值矩阵相点乘,得到最后的输出结果,O=Fn(…(F2(F1(XW(1))W(2))…)W(n)),F(xw(i))为第i层的激活函数。

    第二阶段(反向传播阶段):

    a)计算实际输出o和理想输出y的残差

    b)按极小化误差的方法反向传播调整权重

    总结:总体而言卷积神经网络可以简化为如下模型:

    图4 

    其中,input到C1,S4到C5,C5到output采用全连接的方式,C1到S2,C3到S4采用一一对应连接方式,S2到C3为了消除网络的对称性,去掉了一部分连接,可以使特征映射更具有多样性。此外,C5卷积核的尺寸要和S4的输出相同,这样才能保证输出为一维的向量。

    五 dropout:我们知道,卷积神经网络一般的结构由数据层,卷积层,抽样层(池化层),Relu(为什么选择Relu作为激活函数,因为它可以加速收敛,从而使学习周期大大缩短)全连接层和损失层,然而最近在学习VGG网络的时候,看到dropout层,于是带着疑问查阅了相关资料,得到的结论就是dropout主要是为防止过拟合,因为在训练大网络的时候,如果训练样本不足,很可能会导致过拟合的发生,可能我们会想到L2正则化,减小网络规模等方法,然而深度学习领域大神Hinton,在2012年文献:《Improving neural networks by preventing co-adaptation of feature detectors》提出了,在每次训练的时候,让一半的特征检测器停止工作,这样可以提高网络的泛化能力,Hinton又把它称之为dropout。Hinton认为过拟合,可以通过阻止某些特征的协同作用来缓解。在每次训练的时候,每个神经元有百分之50的几率被移除,这样可以让一个神经元的出现不应该依赖于另外一个神经元。

    另外,我们可以把dropout理解为 模型平均。 假设我们要实现一个图片分类任务,我们设计出了100000个网络,这100000个网络,我们可以设计得各不相同,然后我们对这100000个网络进行训练,训练完后我们采用平均的方法,进行预测,这样肯定可以提高网络的泛化能力,或者说可以防止过拟合,因为这100000个网络,它们各不相同,可以提高网络的稳定性。而dropout也可以这么理解,假设模型有10000个参数,我们每次以概率p随机地关闭部分神经元,哪些神经元被关闭不作用是随机的,这样,我们利用剩余未关闭的网络进行训练,得到预测结果。然后,我们再重新以概率p随机地关闭网络的部分神经元,由于随机性,我们得到了一个新的与之前不同的网络,再次进行预测;依次类推,假设得到了100000个不同的网络预测的结果,我们就可以根据多数表决原则,得到准确的预测结果,这样就提高了网络的泛化能力。

    假设x是dropout layer的输入,y是dropout layer的输出,W是上一层的所有weight parameters, 是以retaining probability 为p 采样得到的weight parameter子集。把上面的东西用公式表示(忽略bias):

    train:  

    test:

    但是一般写程序的时候,我们想直接在test时用   , 这种表达式。(where  ) 

    因此我们就在训练的时候就直接训练  。 所以训练时,第一个公式修正为    。 即把dropout的输入乘以p 再进行训练,这样得到的训练得到的weight 参数就是  ,测试的时候除了不使用dropout外,不需要再做任何rescale。

    如果想了解更多关于dropout的相关资料,可以参见一下文章:

    http://blog.csdn.net/u012702874/article/details/45030991

    http://blog.csdn.net/l494926429/article/details/51943564

  • 相关阅读:
    浅谈localStorage本地存储
    前端代码中经常遇到的问题
    http状态码
    Transition 所支持的css属性
    ie8下的透明 问题
    #event.initMouseEvent
    svg 文字
    前端工作流程转变
    理解javascript 回调函数
    不要被npm、NodeJs、npm、webpack、vue-cli 这些名词搞晕
  • 原文地址:https://www.cnblogs.com/zy230530/p/6675680.html
Copyright © 2020-2023  润新知