这个获得世界冠军的网络的核心代码只有16行

ImageNet是一个庞大而充满挑战性的数据项目,设计用于视觉对象识别软件研究。ImageNet通过在网络上招募人用手工注释了超过1400万个图像的标签,以指示图像中的内容。在至少一百万个图像中,还提供了边界框,用来做物体检测。 ImageNet数据库包含超过2万个类别,例如“车”或“草莓”,每个类别包含数百个图像。

从2009年开始,ImageNet竞赛就是人工智能领域的盛会。到2017年,ImageNet最终被人工智能战胜,其中在图像分类任务里,分类准确率达到了惊人的2.251% (Top 5,就是提供5个结果中有1个是正确的)。这一盛会最终圆满落幕。

谁是达到2.251%的最终英雄呢?这就是大名鼎鼎的“挤压和激活网络”,英文名是“Squeeze-and-Excitation Networks”,简称SENet。SENet由自动驾驶公司Momenta在2017年公布的一种全新的图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。

这一网络的核心创新代码只有16行,堪称简单有效的工作的又一经典。

在图像分类任务里,我们要让网络学会区分不同的图像,比如这个主要是人,这个主要是车。深度网络的主要任务是提取这些图像的特征,最后通过分类器去根据这些特征把图像分类。如果分类效果不够好,深度网络继续更新这些图像的特征,直到分类器的效果达到最优。这是深度学习的主要模式。

那么一个很重要的问题是,我们如何学到更好的特征?

现有的网络的方法都是通过设计很多通道提取出不同的特征,在网络最后融合这些特征使得效果更好。

这样做非常简单暴力,只用定义深度网络每一层的特征的通道数目,类似于彩色图像有红,绿,蓝三个通道,就可以提取出非常有用的特征用于融合。比如我设计每一层网络的通道数目是64,那么我不管这64个通道是怎么学习的,只要最后的效果好,我就认为网络学到的特征好.

可是大家有没有想过,这样的学习方式有很多弊端。

比如这些通道之间并没有直接的方式相互通信,比如A通道告诉B通道:“嘿,哥们,我们学习的特征差不多,你就不要出现了吧?”

再比如网络本身并不知道这些通道当中,哪些特征是比较重要的。

是不是这个道理?

上述方式很难保证学习到的特征是没有冗余的,或者根本没有一个机制保证重要的特征被重视。

那么我们有必要设计一个机制,使得深度网络自动关注到更加重要的特征,并且主动忽视那些冗余的特征。

怎么做?

注意力机制!

因此,明确的说,SENet所解决的问题其实很简单:通过对特征通道之间的关系进行明确建模,允许特征与特征之间进行通信,从而得到更有利于解决问题的特征。

为解决这个问题,SENet的作者们设计出一个“Squeeze-and-Excitation” (SE)模块,使得每一层特征按照同一套机制对自我进行评价,网络觉得A特征更重要,就让A得到更大的权重;相反,网络如果觉得B特征不那么重要,就让B得到较小的权重。

只是这么一个非常简单的方式,就使得SENet在ImageNet的图像分类任务上得到了极大的成功。比去年的分类冠军的准确率提升了整整25%。下面我就通过图像和文字来详细介绍SE模块,避免一切数学公式。

先通过一张图看看SE模块:

SE模块通过计算中间白色特征块的每一个通道上的统计量(这里用的是最简单的平均值),然后把这些平均值输入到一个一层的小网络,从而让这些统计量之间进行相互通信,最终决定这些通道的相互重要性程度,并最终把这些重要性程度通过权重的方式放在原来得到的特征里,从而得到右边的彩色的特征。网络认为这些特征对分类任务更加有效。

SE模块中的S和E是分开解释的:

在挤压模块(S)里,网络把每个通道上的特征计算一个全局统计量,这样大小为H x W的一个矩阵就被挤压成了一个数,比如均值。

在激活模块(E)里,网络学习一个一层的小网络,让这些全局统计量之间进行相互竞争,然后利用激活函数设计一个阀门,高于一定阈值的统计量才能被激发出来,从而针对性地选择有效特征。

既然有了SE模块,如何把这个模块用到现有的网络里去呢?作者通过现有的几个经典网络给出了例子。

把SE模块引入Inception网络:

把SE模块引入Residual Network网络:

通过两个例子,我们可以看出,这个SE模块可以无缝嵌入到现有的任意网络里去,可谓非常实际的“即插即用”。

下面我们就可以看看实验了。

1. 先看引入SE模块之后,各个主流网络在ImageNet分类任务上的表现有怎样的提升:

我们可以看到分类错误率有了明显的下降,这说明SE模块确实让这些网络学到了更有用的特征。

2. 再看看作者们设计的嵌入了SE模块的网络和现有最好的方法之间的比较:

可以看到SENet的确取得了更低的错误率,这种提升来之不易。

3. 在另一个数据库上也到了更好的效果。

4. 不仅在分类上,在物体检测上帮助ResNet得到了更好的效果。

5. 分析在SE模块里小网络里的下采样参数对实验结果的影响,发现实验结果对这个参数的变化很鲁邦。

6. SE引入的额外计算量很小,只从569上升到了572,或者140上升到了142。参数个数的增加也差不多在50万个或者60万个左右。

7. SE模块的确使得ResNet在训练上得到了更好的表现

最最关键的是,SE模块的代码非常简单,只有短短的16行,见下图:

总结:SENet把重要通道的特征进行强化,不重要通道的特征弱化,从而得到了更好的效果。这一模块可以被无缝嵌入到所有网络里。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181027G11RXI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券