经典基础网络模型总结

       ImageNet大规模视觉识别挑战赛(ILSVRC)。ILSVRC是基于ImageNet的图像识别竞赛,被誉为是人工智能领域的“世界杯”。其使用的数据集ImageNet是由斯坦福大学视觉实验室于2009年公开的,数据集中包含超过20000类物体,共1600多万张图像。从2010年第一届比赛开始直至2017年宣布ILSVRC归入Kaggle,涌现了许多经典的网络结构,其中包括AlexNet(12年冠军), GoogleNet(14年冠军), VGGNet(14年亚军), ResNet(15年冠军)等。下图所示为七届场景分类比赛为计算机视觉领域贡献了大量经典的研究成果。
在这里插入图片描述

AlexNet

       在2012年之前,场景分类比赛各类网络模型在ImageNet上的Top-5错误率均在20%以上。当时环境下,受限于网络深度,CNN在图像分类上的表现并不好,直到AlexNet横空出世,以16.4%的错误率,10个百分点的大差距领先于第二名,夺得了2012年ILSVRC的冠军,就这样CNN进入了公众的视野,引起了大量研究学者的关注。与之前的神经网络相比,AlexNet在网络结构方面有几个方面的改进,这些改进为后续网络起到了较好的借鉴启发作用。下面将详细介绍这些当时让人眼前一新的改进点。
1.使用整流线性神经元(ReLU)激活函数
       在之前的神经网络中,大都使用sigmod函数或是双曲正切函数(tanh)作为激活函数。而在AlexNet中则使用的是ReLU激活函数,ReLU激活函数可表为:

f(x)=max(0,x)
ReLU激活函数与之前的激活函数相比,主要具有以下优点:首先其形式简单,在反向传播时计算梯度的计算量小,其次其在正数部分是线性函数,能避免梯度消失并且加速网络收敛;最后它会在一定情况下输出为0,这样能使得网络具有一定的稀疏性,一定程度上避免过拟合现象的发生。

2.局部响应值归一化(Local Response Normalization,LRN)
       使用了ReLU激活函数后,理想情况下即使没有对输入数据进行归一化处理,网络也不容易出现饱和现象。只要有一些样本在ReLU中的输入为正,就能避免神经元失活。然而,[25]中还是提供了一种归一化的方法来增强网络的泛化能力,其具体公式如下:
在这里插入图片描述
上式中a_(x,y)j 代表在第i个通道位置为(x,y)处经过卷积或池化层再经过ReLU激活函数后的输出值,N为总通道数,n代表前后邻近通道数,需要注意的是对输出的累加求和是沿着通道方向的,另外k,n,α,β都是超参数,一般按k=2,n=5,α=1(e-4),β=0.75进行设置。
       局部响应归一化主要是利用神经学中的侧抑制思想实现网络神经元的局部抑制,达到数据归一化的效果,文章[25]指出这尤其对ReLU激活函数后的输出效果更好。然而,这在后续文章中[72]被证明是不必要的,并且效果是微乎其微的。
3.数据增强
       对于深度学习任务,数据增强可以对结果起到锦上添花的效果。在AlexNet的论文中,作者也提出了两种数据增强的方法。一种是通过随机裁剪和水平翻转进行数据扩充。具体来说,在训练阶段对于每个256256的输入,从中随机裁剪出一块224224的区域,将该区域与其水平翻转的图片都作为样本输入网络中。在测试阶段,在测试图片上随机选取5个区域以及其水平翻转图片输入网络中,并输出这十张区域图片预测的平均值。另一种数据增强方法是改变输入图像RGB值的强度,对于输入图像的每个像素点,对应其RGB值I_(x,y)=[I_(x,y)R,I_(x,y)G,I_(x,y)B ]T,将其加上值[p_1,p_2,p_3 ]或[α_1 λ_1,α_2 λ_2,α_3 λ_3 ]T。其中向量p和参数λ为通过主成分分析法求出的特征向量与其对应的特征值。
4.Dropout技术
       集成不同的模型来进行预测是一个能有效减小测试误差的模型连接方式。但是这样训练网络需要耗费大量的时间和计算资源。而Dropout技术仅需要不到两倍的训练开销,便可以实现模型集成。Dropout技术的实现十分简单,即在网络训练时,对于每个神经元,以一定的概率p(通常是0.5)将其输出置0。即以一定的概率使得神经元在本轮训练中失活。因此,在每轮训练中,网络的结构都将发生改变。这种方法减弱了神经元的连接适应性,强迫其提取鲁棒性更强的特征。理论上,当p=0.5时,对于含有n个神经元的网络,相当于同时训练了2n个不同的网络。虽然实际效果不可能达到理论上的水平,但是,Dropout技术确实能显著提高网络的识别能力,并且降低了过拟合的风险。

VGGNet

       对于神经网络而言,增加参数的数量有两种途径,一种是增加网络的宽度,另一种是增加网络的层数。但是实际实验中,增加层数往往能比增加宽度取得更好的效果并且更容易实现。虽然还没有严格的数学证明,但是人们猜测可能是由于相比于扩大单个函数的参数量,多个函数复合能取得更好的拟合效果。而更直观一些的猜测是,受限于感知域,在浅层所提取的特征往往是局部特征,不能很好地反映输入数据的整体信息。
       另一方面,卷积核大小也会影响着网络的参数。显然,当参数总量一定时,增大卷积核的大小就必然会减少网络的层数。事实上,一个5x5大小的卷积核的感知域和两个连续的3x3卷积核是相同的,但是后者的参数量只有前者的72%。所以,从减小参数量和提高网络深度的角度出发,使用较小的卷积核要比较大的卷积核更有效。由于卷积核的尺寸必须是奇数(偶数无法提取各个方向的信息),而1x1的卷积仅能在通道方向对图像进行变换。所以,3x3是卷积层中能使用的最小的卷积核。
       基于上述两点,VGGNet正是采用3x3卷积和池化层组合构建网络的,论文中一共提出了6种VGGNet的结构,下图所示是两种常用的结构VGG-16和VGG-19:
在这里插入图片描述
       可以看到,在VGGNet的结构中,尝试了使用不同数量的3x3卷积核进行堆叠。在19层的VGGNet中,使用了4个3x3卷积核的堆叠,其感知域与1个9*9的卷积核相同,但是大大减少了参数数量,而且使用多个非线性函数复合,可以提高网络的判别力。
       同时,在VGGNet的文章中,还探讨了1x1卷积层的作用。1x1卷积在不影响感知域的情况下来增强网络的非线性性。还对输出的特征图谱在空间维度上进行了线性映射。

GoogLeNet

       通常情况下,提高网络的特征识别能力往往需要扩大网络的规模,即增加网络的层数和每层的节点个数,从而增加网络的深度和宽度。在具有大量的标注样本时,这种方法是可行的,然而,这种方法会产生两个严重的弊端。一方面,网络规模的增大意味着参数数目的增加;另一方面,当训练样本数不足时,网络在训练时就容易出现过拟合的现象。由于增加样本数量往往需要耗费巨大的人力物力,模型的设计与训练就会出现明显的短板。另一方面,增大网络的规模会使得训练过程中计算资源的消耗明显增加。比如,在CNN的训练过程中,对于两个连续的卷积层,卷积核数目的线性增加将会导致计算量的平方级增长,而且,如果增加参数对应的值在训练时接近于0,将会导致计算资源的极大浪费。
       针对上述问题,学者们提出了许多方法,试图解决网络规模的增大所带来的弊端。其中一个思路就是用稀疏连接层代替全连接层(事实上,稀疏连接也更加符合人脑神经系统的工作原理),包括在卷积层中,也采用稀疏连接的方式。然而,受限于当前计算机架构,在非均匀的稀疏数据上进行计算时,查询和缓存的效率远远低于计算效率,从而导致时间开销的增大。
       在此背景下,谷歌团队提出了Inception结构,通过密集连接的组合来近似稀疏结构。最早提出的Inception结构(Inception V1)如下图所示:
在这里插入图片描述
       可以看出,inception结构使用了1x1,3x3,5x5三种不同大小的卷积核来提取输入层的特征,将卷积步长设为1,padding分别设置为0,1,2,这三个卷积核得到相同大小的输出,从而可以直接进行拼接。不同大小的卷积核由于感知域不同,可以提取不同尺寸的特征。随着网络深度的增加,其特征的感知域也会增大,因此需要逐渐增加3x3和5x5的卷积核个数。然而,在实际实验中,当通道数较多时,3x3和5x5卷积的计算开销将会十分巨大,因此,论文中在3x3和5x5卷积所在网络路径中加入1x1卷积来减少特征通道数,从而降低计算开销。
       随后,该团队提出了非常有影响的批归一化层(Batch Normalization,BN)方法,同时在后续又借鉴了VGGNet的思想,如图3.4所示,使用小尺寸的卷积核的组合来代替大尺寸的卷积核(用2个3x3的卷积核替代1个5x5卷积核),并在适当情况下将卷积进行分解(用1xn和nx1卷积核替代nxn卷积核),相继提出了Inception V2、InceptionV3的结构。
两种改进后的inception结构
       在Inception V3的基础上,基于Depthwise Separable Convolution的思想,Google团队又提出了Xception结构。Xception结构中的模块,首先在空间维度上进行1x1卷积,将输入特征图转化为单通道,之后对每个输出通道的特征图进行3x3卷积后再拼接起来。与Inception V3相比,Xception结构的参数量更小,而且提高了最终的识别率。
Inception模块的“极端”版本

ResNet

       通常情况下,加深网络的深度可以增强模型的学习能力,更好地提取样本特征。但是,网络深度的增加会提高训练难度,在训练过程中容易出现梯度爆炸或是梯度消失的现象,而且参数的增加往往会使网络有过拟合的倾向。因此,过深的网络往往会出现准确率不升反降的退化现象。而ResNet就是针对这个问题而提出的。ResNet可以有效地解决当网络加深出现的梯度消失以及退化现象。ResNet的主要结构就是残差模块,其中主要包含两个部分,残差学习和恒等映射通道,残差结构如下图所示:
残差模块(Res Block)结构
1.残差学习
       假设我们使用神经网络D去拟合函数H(x),常规的做法应该是训练网络D,使得D(x)与H(x)的距离尽可能的小。但是在ResNet的论文中,作者提出学习残差F(x)=H(x)-x要比直接学习原函数H(x)更加容易。其主要原因是由于恒等映射通道保留了梯度,ResNet在层数加深后依然有良好的表现。
2.恒等映射通道
       由于网络学习的是残差函数F(x),而目标函数H(x)=F(x)+x,因此,需要将输入x传到输出层中,而传输的通道便被称为恒等映射通道。在这之前的研究中,也曾提出过残差学习的概念,然而恒等映射通道是有一定概率关闭的。但是在ResNet中,恒等映射通道是始终保持开启状态的,这使得在反向传播的过程中,梯度可以通过恒等映射通道完整地回传,避免了由于网络深度的加深而导致的梯度爆炸或是消失的现象。
       另外,在文章中,作者一共提出了5种深度不同的ResNet结构,其深度分别为18,34,50,101,152。在不同深度的网络中,Res Block的结构也存在着不同。在ResNet-18/34中,仅使用了两个3x3的卷积层,而在较深的网络ResNet-50/101/152 中,Res Block中加入了瓶颈(bottleneck)结构。首先通过1x1卷积减少通道数,降低卷积层的输入维度,卷积后再通过1x1卷积来提高维度。在网络层数较多的情况下,bottleneck结构能够显著地降低网络参数,避免网络的退化。

DenseNet

       DenseNet借鉴了ResNet的思想,提出了稠密模块(Dense Block)的概念。在Res Block中,仅有输入层与输出层存在shortcut连接,但是在Dense Block中,任意两个卷积层之间都能通过shortcut直接连接。Dense Block的结构如图3.7所示,其中X_0表示输入图像,X_i表示第i层的输出,H_i (.)表示多组运算的复合,在DenseNet中,H_i=BN-ReLU-Conv。即先进行批批归一化操作,再通过ReLU激活函数,最后进行卷积操作。
稠密模块(Dense Block)
       在ResNet中,使用了残差连接的思想,这使得梯度在反向传播时可以通过单位映射回传到上层。借用这种思想,DenseNet 提出了密度连接的概念,对于模块中的所有层进行连接,具体计算公式为:

x_i=H([x_0,x_1,...,x_(i-1)])
       其中[x_0,x_1,...,x_(l-1)]表示了这些特征图的拼接。显然,当特征图的大小发生变化时,便无法进行拼接。然而CNN的一个重要部分便是通过下采样来降低特征图谱的规模。因此,DenseNet采用了多个Dense Block连接的方式来构建网络,而任意两个Dense Block通过1x1的卷积层和2x2的池化层的组合连接。

       此外,在Dense Block中,可以看出,随着层数的增加,其对应的通道数也在显著地不断增加。相应地,网络的计算量也会增加。因此,在DenseNet中还加入了瓶颈结构,即通过1x1的卷积核来降低通道数。
       总的来说,DenseNet有以下四点改进:减轻了梯度消失的现象;增强了特征的传播;对特征进行再利用;显著减少了参数数量。

SE-Net

SE-Net 是 Squeeze-and-Excitation Networks的缩写,其出发点来自于显式地建模特征通道之间的相互依赖关系。可以看出主要有两个重要的操作Squeeze 和Excitation。
在这里插入图片描述
1. Squeeze操作
如上图所示,显然看出Squeeze操作是顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。在实际实现上,使用全局平均池化来进行这一操作。

2. Excitation操作
通过参数 来为每个特征通道生成权重,其中参数 被学习用来显式地建模特征通道间的相关性。使用两个全连接层和一个sigmoid来实现。

3. ReWeight操作
将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

代码实现

# SE模块 pytorch版本
from torch import nn
class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

可以将SE模块加入到经典的网络结构中,在相同层数模型比较上,比如resnet50和se-resnet50,在模型参数上增加了些许,但是在准确率上有一定的提升。并且SE模块通道之间的相关联,对于一些任务有很好的效果,有点attention的思想在。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值