GoogLeNet有四篇文章,这是第三篇,虽然我感觉这没有前两篇经典了,但是为了学习的完整还是看了看。

 

Rethinking the Inception Architecture for Computer Vision

重新思考计算机视觉的初始架构

0 摘要

卷积网络是最先进的计算机视觉解决方案的核心,用于各种各样的任务。自2014年以来,非常深的卷积网络开始成为主流,在各种基准中产生了巨大的收益。尽管增加的模型尺寸和计算成本往往转化为大多数任务的即时质量提高(只要提供足够的标记数据用于培训),但计算效率和低参数计数仍然是各种用例(如移动视觉和大数据场景)的有利因素。在这里,我们正在探索扩大网络规模的方法,目的是通过适当的卷积分解和积极的正则化,尽可能有效地利用增加的计算。我们在ILSVRC 2012分类挑战验证集上对我们的方法进行了基准测试,结果表明,与现有技术相比,我们的方法获得了巨大的收益:使用网络进行单帧评估时,top-1误差为21:2%,top-5误差为5:6%,每次推理的计算成本为50亿乘加,使用的参数不到2500万。通过4个模型的集成和多作物评价,我们报告了3:5%的前5个误差和17:3%的前1个误差。

1 介绍

自从2012年的ImageNet竞赛[16]获得Krizhevsky等人的参赛作品[9]以来,他们的网络Alex Net已经成功地应用于更广泛的计算机视觉任务,例如目标检测[5]、分割[12]、人体姿势估计[22]、视频分类[8]、目标跟踪[23]和超分辨率[3]。

这些成功刺激了一个新的研究方向,专注于寻找性能更高的卷积神经网络。从2014年开始,通过利用更深更广的网络,网络架构的质量显著提高。VGG Net[18]和GoogLe Net[20]在2014 ILSVRC[16]分类挑战中取得了类似的高性能。一个有趣的观察结果是,在各种各样的应用领域中,分类性能的提高往往转化为显著的质量提高。这意味着,深卷积体系结构中的体系结构改进可以用于提高大多数其他计算机视觉任务的性能,这些任务越来越依赖于高质量、学习的视觉特征。此外,网络质量的提高为卷积网络带来了新的应用领域,在这种情况下,Alex Net功能无法与手工设计的解决方案竞争,例如检测中的建议生成[4]。

VGGNet的架构简洁,但这样做成本很高,评估网络需要大量计算。Inception架构在被设计为在内存和计算预算严格限制的情况下也能表现良好。GoogLeNet仅有500万参数,是AlexNet的1/12;VGGNet的参数是AlexNet的1/3。

Inception架构的计算成本远低于VGGNet,而且它的性能也高于其他后继者。在大量数据需要以合理成本处理的情况下或在内存或计算能力固有地受限情况下,利用Inception网络变得可行。然而,Inception架构的复杂性使得更难以对网络进行更改。如果单纯地放大架构,大部分的计算收益可能会立即丢失,使得它难以在适应新用例的同时保持其效率。如果增大Inception模型的容量,如果只是双倍增加滤波器组的数量,参数量和计算量将会增大4倍;在许多场景中,不允许这样设计。在本文中,我们描述一些一般原则和优化思想,能够以有效的方式扩展卷积网络。这些原则不局限于Inception网络。

2 通用设计原则

原则1

避免代表性瓶颈,尤其是在网络早期。

前馈网络可以用从输入层到分类器或回归器的无环图来表示。这为信息流定义了一个明确的方向。对于将输入和输出分开的任何切割,可以访问通过切割的信息量。人们应该避免过度压缩的瓶颈。一般来说,在达到用于手头任务的最终表示之前,表示大小应该从输入到输出逐渐减小。从理论上讲,信息内容不能仅仅通过表征的维度来评估,因为它抛弃了相关结构等重要因素;维度仅仅提供了信息内容的粗略估计。(个人理解:一个不合理的例子,比如在网络输出层的shape是227x227x3,经过第一层卷积层之后可能会变成200x200x64,维度的增加可以理解成通道数由原来的3增加到64,通道数的增加获得的信息不能弥补特征图尺寸的急剧压缩丢失的信息。)

原则2

不太容易理解。原文如下:

Higher dimensional representations are easier to process locally within a network. Increasing the activations per tile in a convolutional network allows for more disentangled features. The resulting networks will train faster。

结合 figure7 下面的注释,个人理解在高维表示时,稀疏表示是最重要的。对于局部的特征更容易处理,意思就是local卷积,用1x1或者3x3,不要用太大的。

原则3

空间聚合可以在较低维度嵌入上完成,而不会在表示能力上造成许多或任何损失。例如,在执行大尺度卷积(3x3)之前,可以在空间聚合之前,先对输入进行降维,这样不会带来严重影响。鉴于这些信号应该易于压缩,因此降维甚至会促进更快的学习

原则4

平衡网络的宽度和深度。要使得计算资源平衡的分配在模型的深度和宽度上面,才能最大化的提高模型的性能。

尽管这些原则可能有道理,但用它们来提高现成网络的质量并非易事。我们的想法是只在模棱两可的情况下明智地使用它们。

3 大滤波器尺寸分解卷积

GoogLeNet网络[20]性能优异很大程度上是因为降维的使用。这可以看作是以计算有效的方式分解卷积的特例。例如,考虑1×1卷积层后跟3×3卷积层的情况。在视觉网络中,预期邻近激活的输出是高度相关的。因此,我们可以预期,在聚合之前,它们的激活会减少,这将导致类似的表达性局部表示。

在这里,我们探讨了在各种情况下分解卷积的其他方法,特别是为了提高解的计算效率。由于初始网络是完全卷积的,每个权值对应于每个激活的一次乘法。因此,计算成本的任何减少都会导致参数数量的减少。这意味着,通过适当的因式分解,我们可以得到更多的分离参数,因此训练速度更快。此外,我们可以利用节省的计算和内存来增加网络的滤波器组大小,同时保持在一台计算机上训练每个模型副本的能力。

3.1 分解到更小的卷积

大的卷积(5x5或者7x7)计算量更大,例如filter相同情况下,5x5卷积核比3x3卷积核计算量大25/9=2.78倍。5x5卷积核相比3x3卷积核有广阔“视野”,可以捕捉到更多信息,单纯减小卷积核大小会造成信息损失。那么是否可以通过使用具有相同输入尺寸和输出深度的参数较小的多层网络替代5x5卷积?把5x5网络看做全卷积,每个输出是卷积核在输入上滑动,可以通过2层的3x3的全卷积网络替换。这样,我们最终得到一个计算量减少到(9+9)/25倍的网络,通过这种分解减少了28%的参数。这种替换是否会导致任何表征力的丧失?如果我们的主要目标是对计算的线性部分进行分解,是不是建议在第一层保持线性激活?实验结果表明,在分解的所有阶段中使用线性激活总是逊于使用修正线性单元。也就是全部使用 relu 激活函数会好一些。我们将这个收益归因于网络可以有更多的非线性变化,使得网络对特征的学习能力更强。

 

 

 

下图为GoogLeNet中的Inception模块结构

下图为按原则3设计,改进的Inception模块结构

3.2 空间分解为不对称卷积

上述结果表明,大于3x3的卷积核可能不是很有用,因为它们总是可以简化为3×3卷积层。那么是否可以把3x3的卷积分解成更小?比如2x2。然而,通过使用非对称卷积,可以做出甚至比2×2更好的效果,非对称卷积比如n×1。例如一个3x1卷积,后面跟一个1x3卷积,相当于3x3的卷积。如果输入和输出滤波器的数量相等,将3×3卷积分解为一个3×1卷积和一个1×3卷积的参数少了33%。相比之下,将3×3卷积分解为两个2×2卷积表示仅节省了11%的计算量。

在理论上,可以进一步论证,可以通过1×n卷积和后面接一个n×1卷积替换任何n×n卷积,并且随着n增长,计算成本节省显著增加。实际上,在比较前面的层使用这种结构,效果并不好。但是对于中等网格尺寸(在m×m特征图上,其中m范围在12到20之间),其给出了非常好的结果。在这个水平上,通过使用1×7卷积,然后是7×1卷积可以获得非常好的结果。

下图为非对称分解后Inception模块结构

 

 

4 利用辅助分类器

GoogLeNet引入的辅助分类器可以改善深度神经网络的收敛。最初的动机是将有用的梯度推向较低层,使其立即反向传播,避免非常深的网络中的消失梯度问题,从而提高训练过程中网络的收敛。但是,我们发现辅助分类器在训练早期并没有导致改善收敛情况。在两个模型达到高精度之前,有无辅助分类器的网络训练进度看起来几乎相同。接近训练结束时,辅助分支网络开始超越没有任何分支的网络的准确性,达到了更高的稳定水平。

去掉GoogLeNet网络低层的辅助分类器对最终网络的质量没有不良的影响。GoogLeNet最初的假设,这些分支有助于演变低级特征有可能不适当。相反,我们认为辅助分类器扮演者正则化的角色。如果侧分支使用了批标准化或具有dropout的层,那么网络的主分类器性能更好。

5有效的减少网格尺寸

传统上,卷积网络使用一些池化操作来减小特征图的网格大小。为了避免表示瓶颈,在应用最大池化或平均池化之前,常常增加feature map个数。例如一个带有k个filters的d×d的网格,如果我们想要达到2k个filters的d/2×d/2的网格,我们首先需要对k个d×d的网格进行一次有2k个filters,步长为1的卷积,得到2k个d×d的网格,然后再进行池化。

下图示例,假如有一个35×35×320的特征图,最终要变成17×17×640的特征图。左边的做法在池化前没有增加通道数,这样会导致表示瓶颈。右边的做法先对35×35×320进行步长为1,640个卷积核的卷积运算,得到35×35×640的特征图,和原来相比增加了通道数,然后再池化,符合原则1的要求,不会导致表示瓶颈。

但是左图的方式先池化后卷积的计算量为2*(d/2)2k22(d2)2k2,右图的方式先卷积后池化的计算量为2d2k22d2k2。虽然右边的方式避免了表示瓶颈,但是右边的计算成本比左边的高了4倍。

本文提出了一种变体,降低了计算成本,而且又可以避免表示瓶颈。这是一种并行的结构,使用两个并行的步长为2的模块,P和C。P是一个池化层,C是一个卷积层,然后将两个模型的响应组合到一起。

下图是减小网格尺寸的同时扩展filters的Inception模块。它不仅廉价并且避免了原则1中提出的表示瓶颈。右侧的图是从网格大小的角度来看。

6 Inception-v2

基于以上的介绍,提出了一种新的结构。

下图Inception-v2

把7x7卷积替换为3个3x3卷积。包含3个Inception部分。第一部分是35x35x288,使用了2个3x3卷积代替了传统的5x5;第二部分减小了feature map,增多了filters,为17x17x768,使用了nx1->1xn结构;第三部分增多了filter,使用了卷积池化并行结构。网络有42层,但是计算量只有GoogLeNet的2.5倍。

7 低分辨率输入上的性能

在这里还想提到的就是低分辨率的问题,机器所要识别的目标并不总是高分辨率的,有可能是比较小,或者分辨率比较低的。 常用的做法是使用更高分辨率的接受域,但是有时候我们需要分清,究竟是使用更高分辨率接受域的效果,还是更大的模型容量和计算量的效果。 如果我们只是改变输入的分辨率而不进一步调整模型,那么我们最终将使用计算上更便宜的模型来解决更困难的任务。作者提出的方法如下:针对低分辨率的图像输入,应该降低前两层的步长,或移除第一个池化层。

8 实验

9 总结

Inception V3设计了3种形式的Inception模块,包括将大滤波器进行分解、分解成不对称的结构、以及通过并行结构来解决信息损失的问题,虽然模型的拓扑结构更加复杂了,但是计算量大大降低,而且模型性能大大提高了。

总结:

  1. 特征图尺寸不能减小太快,尤其是刚开始的时候
  2. 用小卷积核
  3. 空间分解成不对称的卷积
  4. 池化层
  5. dropout

 

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐