首页 >汽车

InceptionNetwork各版本演

2019-04-11 04:16:11 | 来源: 汽车

雷锋按:本文为雷锋字幕组编译的技术博客 A Simple Guide to the Versions of the Inception Network,原标题,作者为 Bharath Raj。

翻译 |胡瑛皓 乔月 整理 | 凡江

Inception 络是卷积神经络 (CNN) 分类器发展中的一个重要里程碑。在 inception 之前, 大多数流行的 CNN 只是将卷积层堆叠得越来越深,以期获得更好的效果。

这就是 CNN 架构设计。有趣的是这个说法在篇 inception 络的论文()中被引用。

从另个方面来看 Inception network 是复杂的(大量工程优化)。使用很多的技巧以提高其性能 (同时从速度和准确率)。随着不断演进,也产生了几个不同版本的络。以下是几个流行的版本:

Inception v1()

Inception v2 与 Inception v3()

Inception v4 与 Inception-ResNet()

上面每个版本均是对其前一个版本的迭代改进。理解版本升级的细节可以帮助我们构建自定义分类器,同时提高速度和准确率。另外,依赖于你的数据,低版本可能实际上效果更好。

本文旨在阐明 inception network 的演进。

Inception v1

这个版本是一切开始的地方。让我们分析一下,初的版本打算解决什么问题,以及它是如何解决问题的。()

前提:

图像中的特征部分尺寸变化很大。比如包含狗的图像可以是以下任一种形式,如下所示。狗在每幅图像中所占面积不同。

从左边到右:狗占据了图片的大部分,狗占据了图片的一部分,狗仅占据了图片的很小一部分(图片来自 Unsplash)。

正是由于在信息所在位置的巨大差异,为卷积操作选择适当的核尺寸变得艰难。当信息分布更全局时,倾向选择一个较大的核;当信息分布的更局部时,倾向选择一个较小的核。

深度络容易过拟合,同时也很难将梯度更新传递至整个络。

单纯堆砌大量卷积操作计算昂贵。

解决方案:

那为什么不能在同一层上采用多个尺寸的过滤器呢?络本质上会变得更宽一些,而不是更深。作者设计 inception 模块就是用了这个想法。

下图就是「初的」inception 模块。在输入图像上用 3 个不同尺寸的过滤器(1x1, 3x3, 5x5)实施卷积操作。然后,执行了池化操作 (max pooling)。输出被连接(concatenated)后,送往下一层 inception 模块。

初的 inception 模块(原文:Inception v1:)。

如前所述,深度神经络计算非常昂贵。为了使计算更快,作者通过在 3x3 和 5x5 卷积操作前增加一个额外的 1x1 卷积,限制输入通道数量。虽然增加一个额外的操作看起来与直觉相反,1x1 卷积比 5x5 卷积操作快很多,减少输入通道数量也有帮助。值得注意的是,1x1 卷积是在池化后执行,而不是之前。

降维的 inception 模块(原文:Inception v1:)

采用降维的 inception 模块构建神经络,这就是我们知道的 GoogLeNet(Inception v1)水芹
。络架构如下:

GoogLeNet. 橙色框是 stem,包含一些基础的卷积操作。紫色框是辅助分类器。络中宽阔部分是 inception 模块(原文:Inception v1:)

GoogLeNet 由 9 组 inception 模块线性堆叠组成。深 22 层(如算上池化层共 27 层)。在一个 inception 模块,采用了全局平均池化操作。

它确实是一个很深的深度分类器。对于任意深度神经络都会发生梯度消失问题。

为防止络中间部分不会「梯度消失」,作者引入了 2 个辅助分类器(图中紫色框)。它们本质上对 2 个 inception 模块的输出执行 softmax,并计算对同一个标签的 1 个辅助损失值。总损失函数是对辅助损失值和真实损失值的加权和。论文中辅助损失值的权值取 0.3。

毋庸置疑,辅助损失值纯粹是为训练构建,分类推断时将被忽略。

Inception v2

Inception v2 、Inception v3 出现在同一篇论文()。作者提出了大量的改进以提升准确度同时降低计算复杂度。Inception v2 探索了以下内容:

前提:

降低 representational bottleneck。其思路是,当卷积不会大幅改变输入尺寸,神经络的性能会更好。减少维度会造成信息大量损失,也就是所说的 representational bottleneck;

采用智能分解方法,卷积操作在计算上更高效。

解决方案:

将 1 个 5x5 卷积分解为 2 个 3x3 卷积操作以提升速度食品经营许可证办理
。虽然这可能看起来与直觉相反,5x5 卷积比 3x3 卷积操作在计算上要昂贵 2.78 倍。因此,事实上 2 个 3x3 卷积的堆叠提高了性能。见下图:

左边 inception v1 模块中的 5x5 卷积现在表示为 2 个 3x3 卷积(原文: Inception v2:)

此外,他们将 nxn 的卷积过滤器分解为一个 1xn 和 nx1 卷积的组合。比如一个 3x3 的卷积等价于执行一个 1x3 的卷积后执行一个 3x1 的卷积。他们发现,这个方法较之前的 3x3 卷积在算力上便宜 33%。如下图所示:

这里,假设 n=3 获得与之前等价的图像。左边 5x5 的卷积可以表示为 2 个 3x3 卷积,然后进一步表示为 1x3、3x1 卷积组合(原文:Inception v2:)

模块中的滤波器组(filter banks)被扩展(使得更宽而不是更深)以消除 representational bottleneck。如果模块变得更深,尺度将会过度缩小,从而导致信息的丢失。如下图所示:

使 inception 模块更宽。这种类型等同于上面显示的模块。(原文: Incpetion v2:

上述三个原则被用来构建三种不同类型的 inception 模块(我们将它们按照引入的顺序称为模块 A,B, 和 C,这些名称是为了清楚而引入的,并不是官方的名字)体系结构如下:

这里,图 5是模块 A,图 6是模块 B,图 7是模块 C。(原文: Incpetion v2:

Inception v3

前提:

作者指出,辅助分类器(auxiliary classifiers)直到训练过程结束,准确性接近饱和时,没有太多的贡献。他们认为,他们的功能是正规化(regularizes),特别是如果他们有 BatchNorm 或 Dropout 操作。

研究不在大幅度改变模块的情况下,改进 Inception v2 的可能性。

解决方案:

Inception Net v3 包含了针对 Inception v2 所述的所有升级,并且增加使用了以下内容:

RMSProp 优化器。

分解为 7x7 卷积。

辅助分类 BatchNorm。

标签平滑(添加到损失公式中的正则化组件类型,防止络过于准确,防止过度拟合。)

Inception v4

Inception v4 和 Inception-ResNet 被介绍在同一篇论文。为了清晰起见,让我们分别讨论他们。

前提:

为了使模块更加统一,作者还注意到一些模块比必要的还要复杂。这可以使我们通过添加更多的统一模块提高其性能。

解决方案:

Inception v4 中 stem 被修改了。这里的 stem,指的是在介绍 Inception 块之前执行的初一组操作。

上图是 Inception-ResNet v1 的 stem,底部图像是 Inception v4 和 Inception-ResNet v2 的 stem (原文: Inception v4:

他们有三个主要的 inception 模块。分别为 A,B 和 C (与 Inception v2 不同 这些模块的实际名字为 A,B 和 C). 它们看起来非常类似与 Inception v2 (or v3) 副本。

(左图)Inception 模块 A,B,C 使用 Inception v4。注意它们与 Inception v2(或 v3)模块相似。(原文: Inception v4:

Inception v4 采用专门的「Reduction Blocks」用于更改格的宽度和高度。早期的版本没有明确的减少块(reduction blocks)但是功能已经实现。

(左图) Reduction Block A (将 35x35 尺寸缩小至 17x17 ) Reduction Block B (将 17x17 尺寸缩小至 8x8)。请参阅本文以获取确切的超参数设置 (V,l,k). (原文: Inception v4:

Inception-ResNet v1 and v2受到 ResNet 性能的启发,提出一种混合 inception 模块。Inception ResNet 有两个子版本分布为 v1 和 v2。在我们检查显著特征之前,让我们看看这两个版本之间的细微差别。

Inception-ResNet v1 有类似于 Inception v3 的计算成本。

Inception-ResNet v2 有类似于 Inception v4 的计算成本。

它们有不同的 stems 如插图 Inception v4 部分所示。

两个子版本对于模块 A,B,C 和 reduction blocks 具有相同的结构。只有超参数设置不同。本节中,我们只关注结构。请参阅本文中的确切超参数设置 (图像是 Inception-Resnet v1)。

前提:

在 inception 模块输入中引入残差连接(residual connections),它增加了卷积运算的输出。

解决方案:

对于剩余工作的补充,卷积后的输入和输出必须具有相同的尺寸。因此,我们在原始卷积之后使用 1x1 卷积来匹配盛大尺寸(深度在卷积之后增加)。

(左图) 在 Inception ResNet 中初始化 Inception 模块 A,B,C。注意如何用残差连接(residual connection)代替池化层(pooling layer),另外在增加前,注意附加 1x1 卷积。(原文: Inception v4:

在主 inception 模块中,池化操作被代替,有利于残差连接(residual connections)。但是倍速链组装线
,你仍然在 reduction blocks 中找到这些操作。reduction blocks A 与 Inception v4 相同。

(左图) Reduction Block A (35x35 尺寸缩小至 17x17 ) Reduction Block B (17x17 尺寸缩小至 8x8 )。请参阅本文中的精确超参数设置 (V,l,k). (原文: Inception v4:

如果滤波器(filters)数目超过 1000,那么络中的残差单元(residual units) 更深的络会导致络「死亡」。为了提高稳定性,作者将残差(residual) 激活的比例调整为 0.1 至 0.3 左右。

激活按常数缩放,以防止络崩溃。(原文:Inception v4

原始论文在求和之后没有使用 BatchNorm 在单个 GPU 上训练模型(为了将整个模型安装在单个 GPU 上)。

发现 Inception-ResNet 模型能够在更低的 epoch 获得更高的精度。

Inception v4 和 Inception-ResNet 终的络布局如下:

顶部图像是 Inception v4 的布局,底部图像是 Inception-ResNet 的布局。(Source: Inception v4:

原文链接:

雷锋(公众号:雷锋)雷锋

猜你喜欢