美文网首页
GoogLeNet(Inception v1-v4)

GoogLeNet(Inception v1-v4)

作者: zelda2333 | 来源:发表于2021-04-25 20:02 被阅读0次

    论文:
    GoogLeNet/Inception-v1: Going Deeper with Convolutions
    BN-Inception/Inception-v2: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
    Inception-v3: Rethinking the Inception Architecture for Computer Vision
    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

    CNN结构演化图

    CNN结构演化图

    从上图可看到VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

    一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
    (1)参数太多,如果训练数据集有限,很容易产生过拟合;
    (2)网络越大、参数越多,计算复杂度越大,难以应用;
    (3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

    解决这些问题的方法是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。

    大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

    Inception V1(2014.09)

    当不知道在卷积神经网络中该使用1 * 1卷积还是3 * 3的卷积还是5 * 5的卷积或者是否需要进行pooling操作的时候,我们就可以通过inception模块来将所有的操作都做一遍,然后将得到的结果直接concat到一起,由神经网络来决定是使用哪种方式处理

    通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:

    该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性

    网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。

    然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:

    基于Inception构建了GoogLeNet的网络结构如下(共22层):

    GoogLeNet网络结构

    对上图说明如下:
    (1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
    (2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
    (3)虽然移除了全连接,但是网络中依然使用了Dropout ;
    (4)为了避免梯度消失,网络额外增加了2个辅助的Loss用于向前传导梯度(辅助分类器,实际上是“深度监督”的策略。)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

    GoogLeNet的网络结构图细节如下:

    注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。

    Inception V2(2015.12)

    在V1的基础上做了两点改进:

    • 加入BN
    • 5 * 5的卷积 -> 两个3 * 3的卷积串联

    Inception V2网络结构图细节如下:

    与Inception V1有以下几点改变
    [1] - 5x5 卷积层被替换为两个连续的 3x3 卷积层. 网络的最大深度增加 9 个权重层. 参数量增加了大约 25%,计算量增加了大约 30%.
    [2] - 28x28 的 Inception 模块的数量由 2 增加到了 3.
    [3] - Inception 模块,Ave 和 Max Pooling 层均有用到. 参考表格.
    [4] - 两个 Inception 模块间不再使用 pooling 层;而在模块 3c 和 4e 中的 concatenation 前采用了 stride-2 conv/pooling 层.
    [5] - 网络结构的第一个卷积层采用了深度乘子为 8 的可分离卷积(separable convolution with depth multiplier 8),减少了计算量,但训练时增加了内存消耗.

    Inception V3(2015.12)

    V2 V3实际上被作者放在了一篇paper里所以也没必要分得特别细。

    设计准则

    1. 避免特征表达瓶颈,尤其是在网络的浅层。
      作者们认为CNN模型本质上是一个DAG(有向无环图),其上信息自底向上流动,而每一个bottleneck的使用都会损失一部分信息,因此当我们出于计算与存储节省而使用bottleneck时,一定要下手轻些(不要一下子使用1x1 conv缩减过多的feature maps的channels数目,如果一定要用reduction模块也要在模型较靠后的几层使用)。

    2. 高维度特征表达在网络的局部中处理起来更加容易。增加CNN每个神经元的激活值会更多地解耦合特征,这会使得网络训练更快。

    3. 低维嵌入空间上的空间聚合(Spatial aggregation)几乎不会影响表达能力。
      这个的解释是相连神经元之间具有很强的相关性,信息有冗余。

    4. 平衡网络的宽度和深度
      两者的平衡能带来更好的性能。

    从3个方面改进Inception

    1. 分解卷积核尺寸

    • 分解为对称的小的卷积核
    • 分解为不对称的卷积核

    分解为对称的小的卷积核
    2个3*3代替1个5*5 减少28%的计算量。

    第一个3*3后接线性激活会不会比ReLU更好?(因为5*5是线性操作,而2个3*3去代替的话全程应当是线性操作)

    实验结果表明relu更优,作者猜测是因为网络能够学习这种空间变化的增强(实验证明这是数据增强)

    分解为不对称的卷积核
    33卷积分解2个22节省11%计算量,而分解成13和31节省33%

    理论上,任何卷积都能分解成不对称卷积,但实验发现,在低层次效果不好,在12到20层加较好。

    不对称的卷积核

    2. 辅助分类器
    在第一篇论文的时候作者认为使用2个 辅助分类器,可以:

    • 把梯度有效的传递回去,不会有梯度消失问题,从而加速训练过程中的收敛。

    Lee等人认为辅助分类器有助于更稳定的训练和better收敛。

    但是在V3里作者又重新探讨了辅助分类器的作用:

    • 辅助分类器并不能加速训练过程的早期收敛,接近训练结束时性能开始超越。

    • Inception v1使用了两个辅助分类器。去掉低层辅助分类器并不会对网络的最终效果产生负面影响。

    作者认为辅助分类器的作用是正则化。作者假设:如果辅助分类器进行BN或Dropout,网络的主分类器的性能会更好。

    3. 改变降低特征图尺寸的方式
    一般情况下,如果想让图像缩小,可以有如下两种方式:

    先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)

    注:上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3x3卷积核代替5x5卷积核),Figure 7是指不对称版的Inception(用1xn、nx1卷积核代替nxn卷积核)。

    组合3个改进的Inception模块,最终的Inception-v3网络如下图12所示,较早的层采用模块A,中间层采用模块B,而后面层采用模块C

    Inception-v3也像GoogLeNet那样使用了深度监督,即中间层引入loss。另外一点是Inception-v3采用了一种Label Smoothing技术来正则化模型,提升泛化能力。其主要理念是防止最大的logit远大于其它logits,因为可能会导致过拟合。

    Inception V4(2016.02)

    Inception-v4是对原来的版本进行了梳理。
    此篇文章还提出了Inception-ResNet(在Inception模块中引入ResNet的残差结构,它共有两个版本),Inception-ResNet-v1对标Inception-v3,两者计算复杂度类似,而Inception-ResNet-v2对标Inception-v4,两者计算复杂度类似。

    我认为Inception-ResNet的模块太复杂(多样化)了,没必要看的很细,这里就只贴结构图了。

    Inception-v4网络结构 Inception-v4网络的Inception模块 Inception-ResNet网络结构与stem模块

    Inception-ResNet-v1的Inception模块如图16所示,与原始Inception模块对比,增加shortcut结构,而且在add之前使用了线性的1x1卷积对齐维度。对于Inception-ResNet-v2模型,与v1比较类似,只是参数设置不同

    Inception-ResNet-v1的Inception模块

    小结
    从最初的GoogLeNet,到最新的Inception-ResNet,Inception网络在不断的迭代中越来越好,相比其它模型,Inception网络相对来说更复杂一些,主要在于模块比较复杂,而且采用的模块也是多样化。未来的话,可能需要AutoML来设计更好的模块结构。

    参考链接:
    大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
    深入浅出——网络模型中Inceptionv1到 v4 的作用与结构全解析
    [论文笔记] Inception V1-V4 系列以及 Xception
    网络结构之 Inception V2

    相关文章

      网友评论

          本文标题:GoogLeNet(Inception v1-v4)

          本文链接:https://www.haomeiwen.com/subject/osicrltx.html