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把重要通道的特征进行强化,不重要通道的特征弱化,从而得到了更好的效果。这一模块可以被无缝嵌入到所有网络里。
领取专属 10元无门槛券
私享最新 技术干货