常见的卷积神经网络

1.LeNet

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

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不算一层)

4.GoogleNet(Google Inception Net)

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

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卷积性价比很高,用很小的计算量就能增加一层特征变换和非线性化。这个结构可以让网络的深度和宽度高效率地扩充,提高准确率且不致于过拟合。

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´35、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

点击见详细描述

猜你喜欢

转载自blog.csdn.net/yunyi4367/article/details/80686406