卷积神经网络总览

转载自:

https://zhuanlan.zhihu.com/p/31006686

https://zhuanlan.zhihu.com/p/33845247


LeNet:1998,Gradient based learning applied to document recognition

卷积神经网络的开山之作,结构非常简单,如图所示:

 


AlexNet:2012,ImageNet Classification with Deep Convolutional Neural Networks

 

网络与之前的网络相比引入了以下新特征:

1.Relu

传统的激活函数一般是sigmoid和tanh两种饱和非线性函数,就训练时间来说,使用这些饱和的非线性函数会比使用非饱和的非线性函数ReLU,模型收敛需要更长的时间。除此之外,ReLU也引入了一定的稀疏性,在特征表示的范畴内,数据有一定的稀疏性,也就是说,有一部分的数据其实是冗余的。通过引入ReLU,可以模拟这种稀疏性,以最大近似的方式来保留数据的特征。

2.双GPU训练

在论文给出的图3中我们可以看到,两个网络是并行的,但是这并不意味着AlexNet一定是并行结构的,这张图只是告诉我们,将AlexNet部署在多GPU上时的工作方式(为什么要部署在多GPU上?因为当时的GTX580只有3GB的显存,不足以容纳该网络最大的模型):每个GPU上并行地、分别地运行AlexNet的一部分(例如将4096个神经元的全连接层拆分为两个并行的2048个神经元的全连接层,第一个卷积层有96个feature map而在一块GPU上只有48个feature map等),两块GPU只在特定的层上有交互。

3.局部响应归一化层(Local Response Normalization Layer)

LRN层只存在于第一层卷积层和第二层卷积层的激活函数后面,引入这一层的主要目的,主要是为了防止过拟合,增加模型的泛化能力。具体方法是在某一确定位置(x,y)将前后各2/n个feature map求和作为下一层的输入。但是存在争论,说LRN Layer其实并没有什么效果,在这里不讨论。

4.Overlapping Pooling

池化操作提取的是一小部分的代表性特征,减少冗余信息。传统的卷积层中,相邻的池化单元是不重叠的,具体点说就是,对于一个8x8的feature map,如果池化的stride=2、window的size=2,我们得到的就是传统的池化操作。如果stride=2,window的size=3,那么在进行池化的过程中,相邻的池化window之间会有重叠的部分,这种池化就是overlapping pooling。论文也指出,这种池化只能“稍微”减轻过拟合

 

减轻过拟合:

1、数据增强的两种方式:

1)、平移、翻转、对称等:

从256x256的图片中随机截取224x224的部分出来:

训练时,取出所有的patch以及它们的水平对称结果,这种操作将整个数据集放大了2048倍,为什么是2048倍呢?因为在vertical和horizontal两个方向上,各有32个位置可以进行crop,也就是32x32个patches。还有它们的horizontal reflection(水平对称),也就是再翻一番,所以,一张图片就可以获得2048个patches。

测试时,取四个角以及中心共五处的patch,加以对这些patch进行水平对称得到的patch来测试网络(一共是10个patches),也就是在预测时将10个patches逐一计算出softmax后的结果,再对所有的预测结果取平均,得到真正的分类。

2)、改变RGB通道的强度:

这么做的原因是利用了自然图片的一条重要性质:物体的鉴别特征并不会因为图片强度和颜色的变化而变化,也就是说,一定程度上改变图片的对比度、亮度、物体的颜色,并不会影响我们对物体的识别。在ImageNet上使用这个方法,降低了1%的top-1 error。

2、Dropout:

在训练时,每次Dropout后,训练的网络是整个深度神经网络的其中一个子网络。在测试时,将dropout层取消,这样得到的前向传播结果其实就是若干个子网络前向传播综合结果的一种近似。

3、Learning rate decay:

随着训练的进行,逐渐减小学习率。


VGG2014,Very deep convolutional networks for large-scale image recognition

 

VGGNet与AlexNet很相似,都是卷积池化-卷积池化-...-全连接的套路,不同的是kernel大小,卷积stride,网络深度。

VGGNet将小卷积核带入人们的视线,分析一下大小卷积核的区别与优劣:

在上面提到的AlexNet中第一个卷积层使用的kernel大小为11x11,stride为4,C3和C5层中使用的都是5x5的卷积核;而出现在VGGNet中大多数的卷积核都是大小为3x3,stride为1的。

直观上我们会觉得大的卷积核更好,因为它可以提取到更大区域内的信息,但是实际上,大卷积核可以用多个小卷积核进行代替。例如,一个5x5的卷积核就可以用两个串联的3x3卷积核来代替,一个7x7的卷积核就可以用三个串联的3x3卷积核来代替。这样的替代方式有两点好处:

1、减少了参数个数:

两个串联的小卷积核需要3x3x2=18个参数,一个5x5的卷积核则有25个参数。

三个串联的小卷积核需要 3x3x3=27个参数,一个7x7的卷积核则有49个参数。

大大减少了参数的数量。

2、引入了更多的非线性:

多少个串联的小卷积核就对应着多少次激活(activation)的过程,而一个大的卷积核就只有一次激活的过程。引入了更多的非线性变换,也就意味着模型的表达能力会更强,可以去拟合更高维的分布。

值得一提的是,VGGNet结构的C里面还用到了1x1的卷积核。但是这里对这种卷积核的使用并不是像Inception里面拿来对通道进行整合,模拟升维和降维,这里并没有改变通道数,所以可以理解为是进一步的引入非线性。

原论文中还提到了一种新的测试方式,称作multi-scale testing,数据增强中也使用了multi-scale方法,不多介绍。


GoogLeNet:详细链接

Inception v1(GoogLeNet)2015,Going deeper with convolutions

ImageNet Top5错误率6.7%

从VGG中我们了解到,网络层数越深效果越好。但是随着模型越深参数越来越多,这就导致网络比较容易过拟合,需要提供更多的训练数据;另外,复杂的网络意味更多的计算量,更大的模型存储,需要更多的资源,且速度不够快。GoogLeNet就是从减少参数的角度来设计网络结构的。

GoogLeNet通过增加网络宽度的方式来增加网络复杂度,让网络可以自己去应该如何选择卷积核。这种设计减少了参数 ,同时提高了网络对多种尺度的适应性。使用了1×1卷积可以使网络在不增加参数的情况下增加网络复杂度。

GoogLeNet则从另一个维度来增加网络能力,每单元有许多层并行计算,让网络更宽了,基本单元如下:

preview

网络总体结构如下所示,包含多个上面的Inception模块,并添加了两个辅助分类分支补充梯度更好训练:

通过网络的水平排布,可以用较浅的网络得到很好的模型能力,并进行多特征融合,同时更容易训练,另外,为了减少计算量,使用了1x1卷积来先对特征通道进行降维。堆叠Inception模块而来就叫Inception网络,而GoogLeNet就是一个精心设计的性能良好的Inception网络(Inception v1)的实例,即GoogLeNet是Inception v1网络的一种。

值得注意的是,网络中有三个softmax,这是为了减轻在深层网络反向传播时梯度消失的影响,也就是说,整个网络的loss是由三个softmax共同组成的,这样在反向传播的时候,即使最后一个softmax传播回来的梯度消失了,还有前两个softmax传播回来的梯度进行辅助。在对网络进行测试的时候,这两个额外的softmax将会被拿掉。这样不仅仅减轻了梯度消失的影响,而且加速了网络的收敛。

 

但是,网络太深无法很好训练的问题还是没有解决,直到ResNet提出了residual connection。

Inception v2(BN-Inception)2015,Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

ImageNet Top5错误率:4.8%

主要是增加了Batch Normalization,之前神经网络很依赖于良好的初始化,并且网络太深会梯度弥散,这两个问题都是因为网络中间的激活的分布不理想,那既然我们想要一个理想的分布,就手动把它转换为理想的分布好了。所以在每一层输出后面加上了归一化变换,减去每个训练batch的每个特征的均值再除以标准差,得到0均值1标准差的输出分布,这样,就可以很好地训练了,梯度也不容易弥散。

Inception v32015,Rethinking the Inception Architecture for Computer Vision

ImageNet Top5错误率:3.5%

核心思想是将卷积核分解成更小的卷积,如将7×7分解成1×7和7×1两个卷积核,使网络参数减少,深度加深

Inception v4、Inception-ResNet v1和v22016,Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

ImageNet Top5错误率:3.08%

引入了ResNet,使训练加速,性能提升。但是当滤波器的数目过大(>1000)时,训练很不稳定,可以加入activate scaling因子来缓解


ResNet2016,Deep residual learning for image recognition

ImageNet Top5错误率3.57%

ResNet通过引入shortcut直连来解决这个问题:

 

通过引入直连,原来需要学习完全的重构映射,从头创建输出,并不容易,而引入直连之后,只需要学习输出和原来输入的差值即可,绝对量变相对量,容易很多,所以叫残差网络。并且,通过引入残差,identity恒等映射,相当于一个梯度高速通道,可以容易地训练避免梯度消失的问题,所以可以得到很深的网络,网络层数由GoogLeNet的22层到了ResNet的152层。

preview


DenseNet2016,Densely Connected Convolutional Networks  详细链接

首先介绍什么是Dense Block:

preview

对于每一层来说,前面所有层的feature map都被直接拿来作为这一层的输入。growth rate就是每一层feature map的个数。
其实在Dense Block输出的地方还有一个bottleneck layer,在bottleneck layer中的操作是一个1x1的卷积,降低channel维度,也就是减少了模型的参数。
在transition layer中有进一步压缩的操作称为compression,减少百分之θ的feature map数量,论文中使用的θ=0.5。

然后介绍DenseNet的模型:

也就是说,DenseNet其实是由若干个Dense Block串联起来而得到的,在每个Dense Block之间有一个Convolution+Pooling的操作,也就是图1中的transition layer。transition layer存在的意义是实现池化,作者在论文中承认了pooling的重要性。

分析一下为什么会从ResNet发展到DenseNet:
借用论文里的话,ResNet直接通过"Summation"操作将特征加起来,一定程度上阻碍(impede)了网络中的信息流。DenseNet通过连接(concatenate)操作来结合feature map,并且每一层都与其他层有关系,都有”沟通“,这种方式使得信息流最大化。其实DenseNet中的dense connectivity就是一种升级版的shortcut connection,提升了网络的鲁棒性并且加快了学习速度。

DenseNet结构如图所示:

图中的每个conv代表的都是BN+ReLU+Conv的一连贯操作。


ResNeXt2017,Aggregated Residual Transformations for Deep Neural Networks 详细链接

ImageNet Top5错误率:3.03%

Inception借鉴ResNet得到Inception-ResNet,而ResNet借鉴Inception得到了ResNeXt,对于每一个ResNet的每一个基本单元,横向扩展,将输入分为几组,使用相同的变换,进行卷积:

上面左边是ResNet,右边是ResNeXt,通过在通道上对输入进行拆分,进行分组卷积,每个卷积核不用扩展到所有通道,可以得到更多更轻量的卷积核,并且,卷积核之间减少了耦合,用相同的计算量,可以得到更高的精度。


Xception2016,Xception: Deep Learning with Depthwise Separable Convolutions 详细链接

Xception则把分组卷积的思想发挥到了极致,每一个通道单独分为一组。利用了depthwise separable convolution,如下图所示,J个输入通道,每个通道用一个单独的空间卷积核卷积(比如3x3),J个卷积核得到J个输出通道,然后再用K个卷积核对上一步得到的J个输出通道进行1x1的普通卷积,得到K个最终的输出:

 

Xception基于一个假设,水平和竖直方向的空间卷积(比如第一步的3x3卷积)和深度方向的通道卷积(比如第二步的1x1卷积)可以完全独立进行,这样减少了不同操作间的耦合,可以有效利用计算力。实验证明,相同的计算量,精度有明显的提升。(不过现在对于分组卷积的底层支持还不够好,实际速度并没有理论计算的那么好,需要底层库进行更好的支持)


移动端

除了主流的ResNet流派和Inception流派不断追求更高的准确率,移动端的应用也是一大方向,比如SqueezeNet、MobileNet 、ShuffleNet等。

MobileNet v12017,MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 详细链接

和Xception类似,通过depthwise separable convolution来减少计算量,设计了一个适用于移动端的,取得性能和效率间很好平衡的一个网络。


MobileNet v22018,Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation   详细链接

使用了ReLU6(即对ReLU输出的结果进行Clip,使得输出的最大值为6)适配移动设备更好量化,然后提出了一种新的Inverted Residuals and Linear Bottleneck,即ResNet基本结构中间使用了depthwise卷积,一个通道一个卷积核,减少计算量,中间的通道数比两头还多(ResNet像漏斗,MobileNet v2像柳叶),并且全去掉了最后输出的ReLU。具体的基本结构如下图右侧所示:


ShuffleNet2017,ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices  详细链接

Xception已经做得很好了,但是1x1那里太耗时间了成了计算的瓶颈,那就分组啦较少计算量,但是分组了,组和组之间信息隔离了,那就重排shuffle一下,强行让信息流动。具体的网络结构如上图左侧所示。channel shuffle就是对通道进行重排,将每组卷积的输出分配到下一次卷积的不同的组去:

 

 

上图的a是没有shuffle,效果很差,b和c则是等价的有shuffle的。ShuffleNet可以达到和AlexNet相同的精度,并且实际速度快13倍(理论上快18倍)。


ShuffleNet V2:2018,Practical Guidelines for Efficient CNN Architecture Design 详细链接

作者在摘要和介绍里提到目前网络结构是根据computation complexity(FLOPs)来设计的,但是FLOPs并不能完全衡量模型,比如在Fig1(c)(d)中,FLOPs相同的情况下,有着不同的speed,因此FLOPs作为computation complexity唯一的指标是不合理的,会带来次优设计。

Practical Guidelines for Efficient Network Design:

第一个实验是关于卷积层的输入输出特征通道数对MAC指标的影响。结论是卷积层的输入和输出特征通道数相等时MAC最小,此时模型速度最快。

第二个实验是关于卷积的group操作对MAC的影响。结论是过多的group操作会增大MAC,从而使模型速度变慢。 

第三个实验是关于模型设计的分支数量对模型速度的影响。结论是模型中的分支数量越少,模型速度越快。 

第四个实验是关于element-wise操作对模型速度的影响。结论是element-wise操作所带来的时间消耗远比在FLOPs上的体现的数值要多,因此要尽可能减少element-wise操作。

 


SENet:2017,Squeeze-and-Excitation Networks 详细链接

SENet的Squeeze-Excitation模块在普通的卷积(单层卷积或复合卷积)由输入X得到输出U以后,对U的每个通道进行全局平均池化得到通道描述子(Squeeze),再利用两层FC得到每个通道的权重值,对U按通道进行重新加权得到最终输出(Excitation),这个过程称之为feature recalibration,通过引入attention重新加权,可以得到抑制无效特征,提升有效特征的权重,并很容易地和现有网络结合,提升现有网络性能,而计算量不会增加太多。

SE module是一个很通用的模块,可以很好地和现有网络集成,提升现有效果。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值