• 卷积神经网络简介

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

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

  • 卷积神经网络的特点

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

  

  图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

CNN基础框架简介的更多相关文章

  1. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  2. 爬虫开发7.scrapy框架简介和基础应用

    scrapy框架简介和基础应用阅读量: 1432 scrapy 今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数 ...

  3. Yaf零基础学习总结1-Yaf框架简介

    从今天开始,给大家讲解下yaf框架,讲解之前肯定要了解下yaf是个什么东西,当然,从标题我们已经知道yaf是个PHP框架了,也许大家对于PHP框架并不陌生,一般PHP程序员用过的框架至少有一两个吧,国 ...

  4. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  5. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  6. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  7. Web自动化框架LazyUI使用手册(1)--框架简介

    作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...

  8. JeeSite 企业信息管理系统基础框架

    1. JeeSite概述 1.1. 简介 JeeSite是一个开源的企业信息管理系统基础框架.主要定位于“企业信息管理”领域,可用作企业信息管理类系统.网站后台管理类系统等.JeeSite是非常强调开 ...

  9. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

随机推荐

  1. 18.SSM整合_搭建开发环境

    1.导入jar包 mybatis的Jar包 ehcache的Jar包 spring的 Jar包 mybatis 与 spring 整合Jar包 JSON的jar包 Jaskson的Jar包 Hiber ...

  2. js页面内容只读,不可复制

    // document.oncontextmenu=new Function("event.returnValue=false"); // document.onselectsta ...

  3. linux操作系统中的常用命令以及快捷键(一)

    接触了linux系统一年,总结一些常用的命令,快捷键等一些尝试 1.首先查看linux内核数量,常用于编译源码包时 用 make -j 来指定内核数来编译 grep ^processor /proc/ ...

  4. github(工蜂)密码过期时sourcetree重新登录

  5. 说说lock到底锁谁(I)?

    写在前面 最近一个月一直在弄文件传输组件,其中用到多线程的技术,但有的地方确实需要只能有一个线程来操作,如何才能保证只有一个线程呢?首先想到的就是锁的概念,最近在我们项目组中听的最多的也是锁谁,如何锁 ...

  6. Mac安装chromedriver和geckodriver

    DY@MacBook-Pro bin$brew install chromedriver Error: No available formula with the name "chromed ...

  7. linux下devel软件包作用

    devel 包主要是供开发用,至少包括以下2个东西: 头文件 链接库 有的还含有开发文档或演示代码. 以 glib 和 glib-devel 为例: 如果你安装基于 glib 开发的程序,只需要安装 ...

  8. java动态代理框架

             java动态代理是一个挺有意思的东西,他有时候可以被使用的很灵活.像rpc的调用,调用方只是定义的一个接口,动态代理让他匹配上对应的不同接口:mybatis内部的实现,编码时,只是实 ...

  9. Java查漏补缺

    1.自动转换按从低到高的顺序转换.不同类型数据间的优先关系如下: 低 ---------------------------------------------> 高 byte,short,ch ...

  10. kudu_CM安装准备工作

    Cloudera Manager简介: hadoop: https://yq.aliyun.com/articles/60759 ----------------------------------- ...