常见的卷积神经网络

1.LeNet

这里写图片描述
点击见详细描述
1994年由卷积网络之父提出
LeNet网络除去输入输出层总共有六层网络,卷积核都是5*5的,stride=1,池化都是平均池化:
conv->pool->conv->pool->conv(fc)->fcweb

2.AlexNet

2012年,Imagenet比赛冠军。是神经网络在低谷期的第一次发声,极大程度推进了深度学习的发展。
这里写图片描述
AlexNet的结构及参数如上图所示,是8层网络结构(忽略激活,池化,LRN,和dropout层),有5个卷积层和3个全链接层,第一卷积层使用大的卷积核,大小为11*11,步长为4,第二卷积层使用5*5的卷积核大小,步长为1,剩余卷积层都是3*3的大小,步长为1。激活函数使用ReLu(虽然不是他发明,可是他将其发扬光大),池化层使用重叠的最大池化,大小为3*3,步长为2。在全链接层增长了dropout,第一次将其实用化。算法

(1)成功使用ReLU做为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在好久以前就被提出了,可是直到AlexNet的出现才将其发扬光大。

(2)训练时使用Dropout随机忽略一部分神经元,以免模型过拟合。Dropout虽有单独的论文论述,可是AlexNet将其实用化,经过实践证明了它的效果。在AlexNet中主要是最后几个全链接层使用了Dropout。

(3)在CNN中使用重叠的最大池化。此前CNN中广泛使用平均池化,AlexNet所有使用最大池化,避免平均池化的模糊化效果。而且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提高了特征的丰富性。

(4)提出了LRN层,对局部神经元的活动建立竞争机制,使得其中响应比较大的值变得相对更大,并抑制其余反馈较小的神经元,加强了模型的泛化能力。简单来讲是对当前层的输出结果作平滑处理。

(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。所以做者将AlexNet分布在两个GPU上,在每一个GPU的显存中储存一半的神经元的参数。由于GPU之间通讯方便,能够互相访问显存,而不须要经过主机内存,因此同时使用多块GPU也是很是高效的。同时,AlexNet的设计让GPU之间的通讯只在网络的某些层进行,控制了通讯的性能损耗。 

(6)数据加强,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),至关于增长了(256-224)2´2=2048倍的数据量。若是没有数据加强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据加强后能够大大减轻过拟合,提高泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共得到10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分作一个标准差为0.1的高斯扰动,增长一些噪声,这个Trick可让错误率再降低1%。

(1)relu激活函数在层数较深时效果比sigmoid好
(2)drop out 下降过拟合,效果好,这算是一个trick吧
(3)步长设置比池化核小,增长特征丰富性
(4)多个LRN就提升0.1%,真是无关紧要,好像如今用的也比较少。
(5)因为当时显卡性能在如今看来十分辣鸡,不能知足神经网络训练要求,因而结构被分红两个并行部分
(6)数据集扩增,防止过拟合。网络

3.VGGNet

VGGNet是牛津大学计算机视觉组和Google DeepMind公司一块儿研发的深度卷积神经网络,并取得了2014年Imagenet比赛定位项目第一名和分类项目第二名。该网络主要是泛化性能很好,容易迁移到其余的图像识别项目上,能够下载VGGNet训练好的参数进行很好的初始化权重操做,不少卷积神经网络都是以该网络为基础,好比FCN,UNet,SegNet等。vgg版本不少,经常使用的是VGG16,VGG19网络。
这里写图片描述
这里写图片描述
VGGNet总结起来就是使用了更小的滤波器,同时使用了更深的结构,Alexnet只有8层网络,而VGGNet有16-19层网络,它的滤波器是3*3卷积滤波器和2*2的大池化层。层叠不少的小滤波器的视野和一个大的滤波器的感觉野是相同的,还能减小参数,同时拥有更深的网络结构(两个3´3的卷积层串联至关于1个5´5的卷积层,即一个像素会跟周围5´5的像素产生关联,能够说感觉野大小为5´5。而3个3´3的卷积层串联的效果则至关于1个7´7的卷积层。除此以外,3个串联的3´3的卷积层,拥有比1个7´7的卷积层更少的参数量。最重要的是,3个3´3的卷积层拥有比1个7´7的卷积层更多的非线性变换(前者可使用三次ReLU激活函数,然后者只有一次),使得CNN对特征的学习能力更强)。
VGGNet拥有5段卷积,VGG16的每一段内有2~3个卷积层(VGG19的后三段是4个卷积层),同时每段尾部会链接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量同样,越靠后的段的卷积核数量越多(64-128-256-512-512)。最后再跟三个全链接层(最后的softmax不算一层)app

4.GoogleNet(Google Inception Net)

一样是2014年首次提出,不过一直在升级。ide

Inception v1

2014年的是Inception v1,相比前面的Alexnet和VGG,Inception v1把占总参数量90%的全链接层去掉,改成1x1的全局平均池化层。V1有22层,层数比AlexNet和VGGNet更深,可是参数更少。
这里写图片描述
这里写图片描述
Inception Net除了最后一层的输出,其中间节点的分类效果也很好。所以在Inception Net中,还使用到了辅助分类节点(auxiliary classifiers),即将中间某一层的输出用做分类,并按一个较小的权重(0.3)加到最终分类结果中。这样至关于作了模型融合,同时给网络增长了反向传播的梯度信号,也提供了额外的正则化,对于整个Inception Net的训练颇有裨益。
Inception module基本结构:
这里写图片描述
其中有4个分支,每一个分支都用到了1*1卷积,这是由于1*1卷积性价比很高,用很小的计算量就能增长一层特征变换和非线性化。这个结构可让网络的深度和宽度高效率地扩充,提升准确率且不致于过拟合。svg

Inception v2

15年提出的Inception V2学习了VGGNet,用两个3x3的卷积来代替5x5的大卷积(减小了参数,减轻了过拟合),在下降参数的同时创建了更多的非线性变换,使得 CNN 对特征的学习能力更强。另外文中还提出了著名的BN归一化算法。
BN是一种很是有效的正则化方法,可让大型卷积网络的训练速度加快不少倍,同时收敛后的分类准确率也获得大幅提高。 BN在用于神经网络某一层时(注: BN层放在激活函数以前,使Wx+b具备更加一致和非稀疏的分布。),会对每个mini-batch的数据内部进行标准化,使输出规范化到N(0,1)正态分布。BN的论文指出,传统的神经网络在训练时,每一层的输入分布都在发生变化,致使训练困难,咱们通常只能使用一个很小的学习率来解决这一问题。BN的使用能够时学习速率增长不少倍,可以减小训练时间。同时BN也具备正则化做用,因此能够取消Dropout层,简化了模型。
只是单纯的使用BN,分类提高效果还不是太明显,论文中使用了几个tricks:
(1)增大学习率,加快学习率衰减速度。
(2)去除Dropout层
(3)去除LRN层(局部归一化层,lrn层放在relu、maxpool层后面,做为单独一层)。函数

Inception v3

一是引入了 Factorization into small convolutions 的思想,将一个较大的二维卷积拆成两个较小的一维卷积,好比将7´7卷积拆成1´7卷积和7´1卷积,或者将3´3卷积拆成1´3卷积和3´1卷积,如上图所示。一方面节约了大量参数,加速运算并减轻了过拟合(比将7´7卷积拆成1´7卷积和7´1卷积,比拆成3个3´3卷积更节约参数),同时增长了一层非线性扩展模型表达能力。论文中指出,这种非对称的卷积结构拆分,其结果比对称地拆为几个相同的小卷积核效果更明显,能够处理更多、更丰富的空间特征,增长特征多样性。
另外一方面,Inception V3 优化了 Inception Module 的结构,如今 Inception Module 有35´3五、17´17和8´8三种不一样结构。这些 Inception Module 只在网络的后部出现,前部仍是普通的卷积层。而且 Inception V3 除了在 Inception Module 中使用分支,还在分支中使用了分支(8´8的结构中),能够说是Network In Network In Network。
这里写图片描述
这里写图片描述性能

Inception v4

Inception V4 相比 V3 主要是结合了微软的 ResNet,将错误率进一步减小。
这里写图片描述学习

5.ResNet

ResNet最根本的动机就是所谓的“退化”问题,即当模型的层次加深时,错误率却提升了,可是模型的深度加深,学习能力加强,所以更深的模型不该当产生比它更浅的模型更高的错误率。而这个“退化”问题产生的缘由归结于优化难题,当模型变复杂时,SGD的优化变得更加困难,致使了模型达不到好的学习效果。
针对这个问题,做者提出了一个Residual的结构:
这里写图片描述
即增长一个identity mapping(恒等映射),将原始所须要学的函数H(x)转换成F(x)+x,而做者认为这两种表达的效果相同,可是优化的难度却并不相同,做者假设F(x)的优化 会比H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,经过一个reformulation,将一个问题分解成多个尺度直接的残差问题,可以很好的起到优化训练的效果。
这个Residual block经过shortcut connection实现,经过shortcut将这个block的输入和输出进行一个element-wise的加叠,这个简单的加法并不会给网络增长额外的参数和计算量,同时却能够大大增长模型的训练速度、提升训练效果,而且当模型的层数加深时,这个简单的结构可以很好的解决退化问题。
文章中提出了两种方式:
这里写图片描述
这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),通常称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了下降参数的数目,第一个1x1的卷积把256维channel降到64维,而后在最后经过1x1卷积恢复,总体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,能够用于34层或者更少的网络中,对于Bottleneck Design的ResNet一般用于更深的如101这样的网络中,目的是减小计算和参数量(实用目的)。
这里写图片描述优化

6.DenseNet

点击见详细描述

7.SqueezeNet

点击见详细描述

8.MobileNet

点击见详细描述

9.ShuffleNet

点击见详细描述

10.Xception

https://blog.csdn.net/u014380165/article/details/75142710/
纵览SqueezeNet、MobileNet、ShuffleNet、Xception