zoukankan      html  css  js  c++  java
  • CNN基础框架简介

    • 卷积神经网络简介

       卷积神经网络是多层感知机的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来。视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,我们称之为感受野。

       通常神经认知机包含特征提取的采样元和抗变形的卷积元,采样元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者控制对特征子模式的反应程度。卷积神经网络可以看作神经认知机的推广。

    • 卷积神经网络的特点

       卷积神经网络成功的关键在于它采用了局部连接(传统神经网络中每个神经元与图片上每个像素相连接)和权值共享(卷积过程中卷积核的权重不变)的方式,一方面减少了权值的数量使得网络易于优化,另一方面降低了过拟合的风险。

      

      图1 全连接与局部连接

       CNN的特征提取层参数是通过训练数据学习得到的,所以其避免了人工特征提取,而是从训练数据中进行学习;同一特征图的神经元共享权值,减少了网络参数,这也是卷积神经网络相对于全连接网络的一大优势。

       CNN一般采用卷积层与采样层交替设置,即一层卷积层接一层采样层,采样层后接一层卷积层……,这样卷积层提取出特征,再进行组合形成更抽象的特征,最后形成对图片对象的特征描述。

       下采样层(Down-Pooling)也称池化层,一般包含平均池化和最大池化。最大池化(Pooling)采样,它是一种非线性降采样方法,其在计算机视觉中的价值主要体现在两个方面:(1)它减小了来自上层隐藏层的计算复杂度;(2)这些池化单元具有平移不变性;由于增强了对位移的鲁棒性,因此是一个高效的降低数据维度的采样方法。

    • CNN的演变史

       

      图2 CNN的演变路径                                         

      CNN的演变路径可以总结为以下几个方向:

        1.从LeNet到Alex-Net

        2.网络结构加深

        3.加强卷积功能

        4.从分类到检测

        5.新增功能模块

    • LeNet

       Paper: http://www.dengfanxin.cn/wp-content/uploads/2016/03/1998Lecun.pdf

      

      图3 LeNet基础网络架构

      作为CNN的开端,LeNet包含了卷积层,池化层,全连接层,这些都是现代CNN网络的基本组件。

      输入尺寸:32*32

      卷积层:3个

      降采样层:2个

      全连接层:1个

      输出:10个类别(数字0~9的概率)

      Inuput(32*32)

      输入图像Size为32*32,比mnist数据库中最大的字母(28*28)还大,这样做的目的是希望潜在的明显特征能够出现在最高层特征监测子感受野的中心

      C1,C3,C5(卷积层)

      卷积运算可以理解为滤波操作(参考Stanford CS131),通过卷积运算,可以使原信号特征增强,并且降低噪声。

      S2,S4(池化层)

      池化层,也称下采样层,是为了降低网络训练参数及模型的过拟合程度,通常有Max-Pooling和Mean-Pooling两种方式。

    • AlexNet

       Paper: https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

      深度学习的鼻祖Hinton(http://study.163.com/course/introduction.htm?courseId=1003842018)和他的学生Alex Krizhevsky 在2012年ImageNet Challenge使用的模型,刷新了Image Classification的记录,从此深度学习进入了一个新时代;

      AlexNet的网络结构如下图所示,总共包含8层,其中前5层为卷积层,后3层为全连接层,输入为1000个分类,一个完整的卷积层通常包含一层convolution,一层Rectified Linear Units,一层max-pooling,一层normalization,AlexNet完整的网络模型如图4所示,为了加快训练,使用了2个GPU;

      

                               图4 AlexNet网络模型  

    layer {
      name: "conv1"
      type: "Convolution"
      bottom: "data"
      top: "conv1"
      param {
        lr_mult: 1
        decay_mult: 1
      }
      param {
        lr_mult: 2
        decay_mult: 0
      }
      convolution_param {
        num_output: 96
        kernel_size: 11
        stride: 4
      #高斯分布初始化权值 weight_filler { type: "gaussian" std: 0.01 }
      #常数(默认为0)初始化权值 bias_filler {   type:
    "constant" value: 0 } } }
    #激活函数,为了引入非线性,ReLU的优点在于收敛速度比sigmoid/tanh快,sigmoid用于二分类,softmax用于多分类
    layer {
      name: "relu1"
      type: "ReLU"
      bottom: "conv1"
      top: "conv1"
    }
    #局部响应归一化层,一般在激活、池化后的一种操作,有利于增加泛化能力(后期VGG,GoogleNet,YOLO未使用该种方式)
    layer {
      name: "norm1"
      type: "LRN"
      bottom: "conv1"
      top: "norm1"
      lrn_param {
        local_size: 5
        alpha: 0.0001
        beta: 0.75
      }
    }
    layer {
      name: "pool1"
      type: "Pooling"
      bottom: "norm1"
      top: "pool1"
      pooling_param {
        pool: MAX
        kernel_size: 3
        stride: 2
      }
    }

      Conv1对应的数据流图如下,AlexNet首先256*256*3的RGB图像进行数据增强,对于输入的图像随机提取224*224*3,并对数据进行水平镜像处理,使得数据集增大了(256-224)*(256-224)*2=2048倍,随后经过预处理变为227*227*3的训练数据;使用96个11*11的卷积核进行卷积运算(每个GPU 48个卷积核),步长为4,对应的输出尺寸为(227+2*0-11)/4+1=55,随后使用3*3的池化层进行下采样,步长为2,对应的输出尺寸为(55+2*0-3)/2+1=27; 

               

                                图5 Conv1数据流图

      Conv2对应的数据流图如下,输入为27*27*96的图像,使用256个5*5*96的卷积核进行卷积运算(每个GPU 128个卷积核),使用pad=2进行填充,输出尺寸为(27+2*2-5)/1+1=27,随后使用3*3的池化层进行下采样,步长为2,对应的输出尺寸为(27+2*0-3)/2+1=13;

      

                                图6 Conv2数据流图

      Conv3对应的数据流图如下,输入为13*13*256的图像,使用384个3*3*256的卷积核进行卷积运算(每个GPU 192个卷积核),使用pad=1进行填充,输出尺寸为(13+2*1-3)/1+1=13,未使用池化层;

      

                                图7 Conv3数据流图

      Conv4对应的数据流图如下,输入为13*13*384的图像,使用384个3*3*384的卷积核进行卷积运算(每个GPU 192个卷积核),使用pad=1进行填充,输出尺寸为(13+2*1-3)/1+1=13,未使用池化层;

      

                                图8 Conv4数据流图

      Conv5对应的数据流图如下,输入为13*13*384的图像,使用384个3*3*384的卷积核进行卷积运算(每个GPU 192个卷积核),使用pad=1进行填充,输出尺寸为(13+2*1-3)/1+1=13随后使用3*3的池化层进行下采样,步长为2,对应的输出尺寸为(13+2*0-3)/2+1=6;

      

                                图9 Conv5数据流图

      Fc6对应的数据流图如下

      

                                图10 Fc6数据流图

      Fc7对应的数据流图如下

      

                                图11 Fc7数据流图

      Fc8对应的数据流图

      

                                图12 Fc8数据流图

      AlexNet的创新性主要在于:

      (1)数据集增强

       常见的数据集增强方法包含:水平翻转、随机裁剪、平移变换、颜色及光照变换,AlexNet通过数据集增强方式将训练数据扩大了2048倍,对模型的训练起了非常重要的作用;

      (2)Dropout

       Dropout是AlexNet的很大一个创新,通过随机忽略神经元,对于防止过拟合起到了极大的作用;

      (3)ReLU激活函数

       用ReLU代替了传统的Tanh或者(Sigmoid)Logistic,具有前向及偏导计算非常简单的特点,同时验证了ReLU在更深的网络超过Sigmoid,不容易发生梯度发散问题;

      (4)LRN

       局部响应归一化,对局部神经元的活动创建竞争机制,这个策略贡献了1.2%的Top-5错误率;

      (5)Overlapping

       使用最大池化替代平均池化,避免了此前使用平均池化出现的模糊效应;

       使用重叠池化意味着池化层的步长比池化核的对应边要小,这个策略贡献了0.3%的Top-5错误率;

    • VGGNet

       Paper: https://arxiv.org/pdf/1409.1556.pdf

        VGGNet由牛津大学的Visual Geometry Group提出,其突出贡献在于其开创性的证明使用小的卷积核,通过增加网络深度可以提高卷积神经网络的表达能力,论文中使用六种不同的网络结构进行测试,为了便于对比,统一使用3*3的卷积核(stride=1)和size为2*2的池化层;

                          

                                          图13 VGGNet网络配置

       1)论文使用的网络配置如图10所示,网络深度由于11层(8个卷积层和3个全连接层)到19层(16个卷积层和3个全连接层)不等,卷积层宽度由64到512,前两个全连接层均有4096个通道,第三个全连接层有1000个通道,用于分类;

       2)AlexNet和ZFNet在第一层卷积层均使用11*11的卷积层,而VGGNet统一使用3*3的卷积层(stride=1),就感受野来说,两个3*3的卷积层叠加与一个(1+3+1)*(1+3+1)的卷积层具有相同的效果,三个3*3的卷积层叠加与一个(1+1+3+1+1)*(1+1+3+1+1)的卷积层具有相同的效果;

        使用多个小卷积核堆叠的方式代替一个大的卷积核主要有两个优势:一,包含多个ReLU使决策函数更有判别性;二,大大减少了参数,降低了对计算资源和内存的需求,也可以理解为单层大卷积核的一种正则化操作,减少了过拟合的风险;

       3)其中网络A和A-LRN的对比用于验证LRN(局部响应标准化)在该训练集上是否有效果,实践证明,这种标准化操作在ILSVRC数据集上并没有提升性能(在AlexNet被证明是有效的),却导致更多的内存消耗和计算时间;

       4)对于VGGNet的训练,通常使用较浅的网络A对参数进行随机初始化,随后使用浅层网络对深层网络进行初始化(即通俗意义上的使用预训练模型进行初始化),达到加速训练的效果   

    • GoogLeNet Inception V1

       Paper: https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf

       一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,但也意味着巨量的参数,同时容易产生过拟合并也大大增加了计算量。2014年《Going deeper with convolutions》一文中提出解决这两个问题的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。另一方面有文献指出,对于大规模稀疏的神经网路,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化

      所以优化的目标就变成了:既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。据此论文借鉴了NIN(Network in Network)的思路,提出了Inception的结构来实现此目的。

      

      对于上图作如下说明:

       1.采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;

       2.选择卷积核大小为1、3、5,同时设定步长stride=1,并设定padding=0、1、2,那么卷积之后便可以得到相同的尺寸,方便拼接在一起,不同尺度的卷积层拥有更丰富的特征;

       3.pooling在减少计算参数量并降低过拟合的风险,因此在Inception中也引用了pooling;

       4.网络越到后面,特征越抽象,并且每个特征所涉及的感受野也更大了,同时随着层数的增加,3*3和5*5卷积的比例也相应的增加;

       5.使用5*5的卷积核仍然会带来巨大的计算量,为此,文章借鉴NIN,采用1*1的卷积核进行降维;

          1*1的卷积层使用低成本进行跨通道的特征变换,在同一个空间位置但是在不同通道的卷积核的输出结果相关性极高,一个1*1的卷积就可以将这些空间位置相同但属于不同通道的连接在一起;

      改进后的GoogLeNet框架如下图所示:

       

      

      GoogLeNet整体连接图如下图所示

        

      对上图作如下说明:

      1.网络最后采用了average pooling 替代全连接层,事实证明可以将Top1 accuracy提高0.6%。但是实际在最后还是加了一个全连接层,主要是为了方便后续finetune;

      2.虽然移除了全连接,但是网络中依然使用了Dropout;

      3.为避免梯度弥散,使用两个softmax作为辅助分类器,将中间某一层的输出用作分类,以较小的权重(0.3)加到最终分类结果,相当于模型融合,同时给网络增加了反向传播的梯度信号,相当于提供额外的正则化,实际测试时这两个额外的softmax会被去掉;

    • GoogLeNet Inception V2

       Paper: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

       最大的亮点是提出了Batch Normalization方法,它最大的作用是:

       1.使用较大的学习率而不用关心梯度爆炸或消失等问题;

       2.降低了模型对初始化权重的依赖;

       3.即使不使用ReLU也能缓和激活函数饱和的问题;

       4.能够学习当前层到下一层的分布缩放(scaling(方差),shift(期望))系数

    • GoogLeNet Inception V3

       Paper: Rethinking the Inception Architecture for Computer Vision

       最大的亮点在于提出:

       1.提出通用的网络结构设计准则    

       避免表达瓶颈,特别是在网络靠前的地方。信息流向前传播过程中不能经过高度压缩的层。

       高维特征更容易处理。高维特征更易区分,会加快训练。

       可以在低纬嵌入上进行空间汇聚而无需担心丢失很多信息。

       平衡网络的宽度与深度.增加宽度或深度可以带来性能上的提升,但需要考虑计算资源的合理性.

       2.引入卷积分解提高效率

        GoogLeNet性能优越很大程度上在于使用了降维,总体上可以分为分解为更小的卷积及非对称卷积,例如使用两层3*3的卷积代替5*5卷积.同时,一个3*1的卷积,后面增加一个1*3的卷积,相当于3*3的卷积(即n*n卷积可以通过1*n和n*1的卷积来代替);

       3.使用辅助分类器

        GoogLeNet中使用了附加分类器,其目的是想把有效梯度传递回去,从而加快训练,实际上辅助分类器起了正则化的作用;

       4.引入高效的feature map降维

    • GoogLeNet Inception V4

       Paper: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning  

    • ResNet

       Paper: Deep Residual Learning for Image Recognition

       随着网络的加深,出现了训练集准确率下降的现象(可以确定这不是由于过拟合造成的,过拟合对应的准确率应该很高),作者为了解决这一问题提出了一个全新的网络,为了解决网络加深时的梯度弥散问题;

       其对应的网络结构如下图所示,在传统的CNN基础上增加了输入到输出的通路,使得输出变为F(x)+x;    

       

       实际上作者在使用中提出了两种ResNet网络设计,分别针对ResNet34和ResNet50/101/152,一般称整个结构为一个"building block",其中右图又称为"bottleneck design";

      

       对于常规ResNet(左图),可用于34层或者更少的网络中,对于BottlenckDesign的ResNet通常用于更深的网络,目的是减少计算量和参数;

    •  ResNext

       Paper:https://arxiv.org/abs/1611.05431

    • SqueezeNet

       Paper:http://arxiv.org/abs/1602.07360

    • SqueezeNext

       Paper:https://arxiv.org/abs/1803.10615

    • MobileNet

       Paper:https://arxiv.org/abs/1704.04861

      

      参考文献

       https://blog.csdn.net/shuzfan/article/details/50738394

       http://blog.csdn.net/cyh_24/article/details/51440344

       https://blog.csdn.net/sunbaigui/article/details/39938097

       http://www.cnblogs.com/gongxijun/p/6027747.html

       http://blog.sina.com.cn/s/blog_6a8198dc0102v9yu.html

       https://www.cnblogs.com/charlotte77/p/8127780.html

  • 相关阅读:
    Android自动化测试中如何处理各种弹窗
    产品经理的私房菜
    Java基础——ArrayList方法全解(字典版)
    ESP8266 WIFI杀手汉化教程 &烧录
    c语言数据拼包
    阿里开源Java诊断工具--Arthas入门
    Java并发包9--Future接口简介
    官宣|VS Code 1.59 发布!Terminal 可以跨窗口移动了!
    微软内推常见问题 Q&A
    03-Numpy库
  • 原文地址:https://www.cnblogs.com/WaitingForU/p/9039034.html
Copyright © 2011-2022 走看看