GoogLe Net(Inception 系列)

Inception V1、V2、V3、V4

GoogLe Net简介

2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。VGG继承了LeNet以及AlexNet的一些框架结构(详见 大话CNN经典模型:VGGNet),而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越

Inception

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:

  1. 参数太多,如果训练数据集有限,很容易产生过拟合
  2. 网络越大、参数越多,计算复杂度越大,难以应用
  3. 网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型

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

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

Inception V1

  1. 简介 Inception V1有 9 个线性堆叠的 Inception 模块,总共有22层(包括池化层的话是27层,最后一个 inception 模块处使用全局平均池化),而AlexNet和VGGNet分别为8层和19层,但它的参数量只有500万个,而AlexNet却有6000万个,仅为1/12,但是准确率远高于AlexNet。
  2. 背景 虽然增加神经网络的规模可以提高性能,但有两个缺点:
  • 参数过多更容易导致过拟合,并且高质量的训练集需要更高的成本。
  • 增加里计算机资源的使用,网络太大,计算复杂程度大,模型训练也困难。
  1. Inception模块 图a是论文中提出的最原始的版本,所有的卷积核都在上一层的所有输出上来做,那5×5的卷积核所需的计算量就太大了,造成了特征图厚度很大。为了避免这一现象提出的inception具有如下结构,在3x3前,5x5前,max pooling后分别加上了1x1的卷积核起到了降低特征图厚度的作用,也就是图b中Inception v1的网络结构。
  • a. 不同的尺寸的卷积核代表着不同的感受野,卷积核大小采用1×1、3×3、5×5,主要是为了方便对齐。设定卷积步长stride=1之后,分别设定pad=0、1、2,卷积之后便可以得到相同维度的特征,然后将特征通过Filter concatenation直接拼接在一起。(打个比方3个10x10x3的图按照深度连接起来就会变成一个10x10x9的图,所以Filter Concatenation就这么简单,把几个图连成一个而已)
  • b. 第一个分支对输入进行了1×1卷积,第二个分支先1×1卷积后3×3卷积,第三个先1×1卷积后5×5卷积,第四个先3×3最大池化后1×1卷积,可以发现一个共性,都进行了1×1的卷积,这是因为1×1卷积可以用很小的计算量添加一层特征变换和非线性化,并且采用1×1卷积来进行将维,例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。所以用1×1卷积核降维大大减少了参数量,有效减小了计算的复杂程度
  1. 结构图
  2. 参数表
  3. 结构说明
  • Global Average Pooling(全局平均池化) 最终的卷积层之后采用Global Average Pooling层,而不是全连接层,这有助于减少参数量
  • 辅助损失 除了上述所说的,为了阻止该网络中间部分梯度消失过程,作者引入了两个辅助分类器。它们对其中两个 Inception 模块的输出执行 softmax 操作,然后在同样的标签上计算辅助损失。总损失即辅助损失和真实损失的加权和。该论文中对每个辅助损失使用的权重值是0.3。 (文中说是为了避免梯度消失问题,也是一种正则化手段。)

# The total loss used by the inception net during training. total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2

Inception V2

  1. 简介 Inception v2Inception v3 来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加准确度减少计算复杂度的修正方法。
  2. 改进
  • 加入了BN(Batch Normalization)层,减少了InternalCovariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯分布,从而增加了模型的鲁棒性,可以以更大的学习速率训练,收敛更快,初始化操作更加随意,同时作为一种正则化技术,可以减少dropout层的使用。
  • 用2个连续的3×3 conv替代inception模块中的5×5,从而实现网络深度的增加,网络整体深度增加了9层。

Inception V3

  1. 简介 Inception v3网络,主要在v2的基础上,提出了卷积分解(Factorization),代表作是Inceptionv3版本的GoogleNet。
  2. 改进
  • 将7×7分解成两个一维的卷积(1×7,7×1),3×3也是一样(1×3,3×1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,更加精细设计了35×35、17×17、8×8的模块。
  • 增加网络宽度,网络输入从224×224变为了299×299。

Inception V4, Inception-ResNet

  1. 简介 Inception v4主要利用残差连接Residual Connection)来改进v3结构,代表作为,Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4。
  2. 残差结构 resnet中的残差结构如下,这个结构设计的就很巧妙,简直神来之笔,使用原始层和经过2个卷基层或者3个卷积层的feature map做Eltwise。 首先介绍几个概念,左边的3×3+3×3(ResNet18,ResNet34)和1×1+3×3+1×1(ResNet50,ResNet101,ResNet152)称为瓶颈单元bootlenect,因为输入为256,中间为64,输出为256,宽窄宽的结构,像瓶子的颈部)。右面的直线,有的实现是直线中有1×1卷积,称为shortcut。整个bootlenect+shortcut称为Residual uint。几个Residual uint的叠加称为Residual block。Resnet结构都是由4个Residual block组成的。 Inception-ResNet的改进就是使用上文的Inception module来替换resnet shortcut中的bootlenect。

参考: 从Inception v1到Inception-ResNet,一文概览Inception家族的「奋斗史」 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2,ShuffleNetV2 Filter Concatenation的理解 大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)