• 卷积神经网络


    卷积神经网络

    起源:喵星人的视觉皮层

        1958 年,一群奇葩的神经科学家把电极插到喵星人的脑子里,去观察视觉皮层的活动。从而推断生物视觉系统是从物体的小部分入手,

    经过层层抽象,最后拼起来送入处理中心,减少物体判断的可疑性的。这种方法就与BP网络背道而驰。

    BP网络认为,大脑每个神经元都要感知物体的全部(全像素全连接),并且只是简单的映射,并没有对物体进行抽象处理。

    谁对谁错呢?卷积神经网络(Convolution Neural Network)最先证明了BP网络的不科学性。

      CNN起源于机器学习大师LeCun在80年代末搞的支票数字识别神经网络。他在BP网络前面尝试了多层的卷积、降采样、以及部分网络连接的创意,

    结果训练效果好得惊人。LeCun的导师是Hinton,也就是最先在2006年提出深度学习(Deep Learning)概念的计算机科学家兼神经科学家。

    LeCun本人也算是半个神经科学家。师徒二人携手撑起了深度学习的蓝天。

    Part I:图像的卷积与降采样

         卷积运算具有平滑、模糊信号的效果,它对原始信号与卷积核邻域做了乘积加权和。一幅图像可分为噪声、细节两部分。

    卷积运算合并了信号部分内容之后,起到了消除噪声,突出细节两个作用。同时,卷积运算的参数也是可以由机器自动训练的,这就成为神经网络的瞄准对象。

    CNN中使用的是二维卷积,卷积方式很简单:参考http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

    上图为vaild卷积,还有一种full卷积,考虑将卷积核移到源图像之外,vaild卷积维度会变小,full会变大(一般不用)

    vaild:Dimnew=Dimoldfilter.Dim+1

    full:Dimnew=Dimold+filter.Dim1

    当然这是后话。二维离散卷积的定义是这样的:g与f顺序是不一样的

    上图中黄色3*3卷积核实际上在做滑动乘积之前,被旋转了180度。

    ⎡⎣⎢135246⎤⎦⎥=>⎡⎣⎢642531⎤⎦⎥

    所以手写卷积时,千万不要忘记了卷积核旋转。

    降采样(Pooling)对应一个size,假如是(2,2),那么每2X2的像素会被合并为1个像素。

    有取最大值作为新值的,以便更加突出特征的Max Pooling方法。

    也有取均值作为新值的,以便更加平滑特征的Mean Pooling方法。

    当然这些都不是重点,pooling强制把像素降了一个量级,①降低了计算量②保证了缩放、旋转不变性[?]

    Part II   CNN的结构

     

    这是LeCun的LeNet5结构,通常拿来作为CNN的教学。

    首先要区分一个概念,filter和feature map。feature map就是上面的一块大板子,size是28x28

    filter指的是卷积核,filter的数量决定着下一层大板子的数量,size就是卷积核大小。

    卷积嵌入到神经网络里,就有了一个权值共享的概念。传统的神经网络,对28x28像素,会有784个神经元,如果下一层也有784个神经元,那么就需要784*784个权值。

    但是卷积神经网络里,将卷积核权值看成是神经元,一个卷积核才多大?5x5=25罢了,784个像素共用这25个神经元,滚来滚去,也就是一套权值。

    研究表明,卷积核数量与数据量规模没有多少关系,而且根据视觉系统的特性,随着层数加深,才有必要增加核数,且不多。比如LeNet的卷积层也就6、16个核

    这样,全连接过程中,尽管需要Num(层K)*Num(层K-1)套权值,但是由于每层feature map数量有限,且一套权值规模又不大,所以训练起来很轻松。

    Theano的注释中用4D张量(其实就是个大小为4的数组)来表示结构转移,假设一个batch有500张图片,都是黑白单通道。

    (图片数,map数,高,宽)---image/input/output, input的map数即为通道数,比如RGB有三个通道,视为3。

    (filter数,map数,高,宽)---filter

    I/O的转移如下:(500,1,32,32)=>(500,6,28,28)=>(500,6,14,14)=>(500,16,10,10)=>(500,16,5,5)=>(500,120,1,1),下面就是隐层+分类器了。

    filter的转移如下:(6,1,5,5)=>(16,6,5,5)=>(120,16,5,5)

    值得注意的是卷积之后的sigmoid,以及偏置b。

    因为是全连接,前一层的map卷积并且结果叠加后,送入sigmoid处理。新一层的每张map的每个像素统一加上b。(Theano中把一维b转成了四维)

    也就是说b等于filter的数量,而不是和W的数量一致。tornadomeet中的解释是错的。

    当然,因为下面还有降采样,所以sigmoid、偏置b可以留到降采样结束后再加上去,形成下一层的input。

    LeCun在构建S2的6个map=>C3的16个map时,并没有采用全连接的方式,而是采用更切合生物视觉的部分连接。参考tornadomeet的解释。

    这样,更好的区分了特征,但是不太好实现。所以Theano干脆就利用conv2d封装的全连接写法搞了个简易版本。

    若是具体实现的话,我觉得首先得把output的map给reshape,然后利用这些map,在conv2d手艹16个单map,组合成下一层的input

  • 相关阅读:
    java-String类
    多线程的细节
    java-多线程的练习----妖,等待唤醒,代码重构,lock到condition
    javascript函数的声明和调用
    表单
    java-多线程的入门_进阶总结
    uboot命令
    u-boot移植 III
    u-boot移植 II
    汇编词典
  • 原文地址:https://www.cnblogs.com/yymn/p/4589571.html
Copyright © 2020-2023  润新知