在特征通道提升网络性能 --SENet网络详解

论文地址:

《Squeeze-and-Excitation Networks》

1. 简介

SENet是ImageNet 2017(ImageNet最后一届比赛)的 Image Classification 任务的冠军模型,和ResNet的出现类似,都在很大程度上减小了之前模型的错误率,并且复杂度低,新增参数量和计算量小。

SENet的全称是Squeeze-and-Excitation Networks,中文可以翻译为压缩和激励网络。

SE block并不是一个完整的网络结构,而是一个子结构,可以嵌入到其他分类或检测模型中。SENet 的核心思想在于通过网络根据 loss 去学习特征权重,使得有效的 feature map 权重大,无效或效果小的 feature map 权重小的方式训练模型达到更好的结果

当然,SE block 嵌入在原有的一些分类网络中不可避免的增加了一些参数和计算量,但是在效果面前还是可接受的。最方便的是SENet思路简单,很容易扩展在已有的网络结构中。

2. 结构

2.1 传统卷积:

卷积神经网络建立在卷积运算的基础上,通过融合局部感受野内的空间信息和通道信息来提取信息特征:

卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。

卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(W和H维度)以及通道间(C 维度)的特征融合,而对于卷积操作,很大一部分工作是提高感受野,即空间上融合更多特征,或者是提取多尺度空间信息。 

从空间维度层面来提升网络的性能:

下图左:Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;

下图右: Inside-Outside 网络中考虑了空间中的上下文信息;

2.2 SENet结构

 中心思想:对于每个输出 channel,预测一个常数权重,对每个channel进行加权,本质上,SE模块是在channel维度上做 attention 或者 gating 操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制那些不重要的 channel 特征。并且SENet可以很方便地集成到现有网络中,提升网络性能,并且代价很小。

SENet网络的创新点在于关注通道特征(channel)之间的关系,希望模型可以自动学到不同 channel 特征的重要程度:

Squeeze 和 Excitation 是两个非常关键的操作,我们希望显式地建模特征通道之间的相互依赖关系。另外,我们采用了一种全新的特征重标定策略。就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

Squeeze 操作:即为压缩部分,顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野;假设原始feature map的维度为H*W*C_{2},其中H是高度(Height),W是宽度(width),C_{2}是通道数(channel)。Squeeze做的事情是把H*W*C_{2}压缩为1*1*C_{2},相当于把H*W压缩成一维的实数;

Excitation 操作:通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性;得到Squeeze的1*1*C_{2}的表示后,加入一个FC全连接层,对每个通道的重要性进行预测,得到不同channel的重要性大小;

Scale操作:即Reweight ,将 Excitation 的输出的权重看做是进行过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

2.3 SENet详细推导

下图表示一个SE block。主要包含Squeeze和Excitation两部分:

Ftr:

转换操作,一个或一组标准的卷积操作,将输入 X 变为输出 U:

这里写图片描述

Ftr的公式如下:

(一个或一组卷积操作,V_{c}表示第c个卷积核,X^{s}表示第s个输入,U就是转换之后的矩阵,即为C个大小为H*W的feature map,U_{c}的c表示U中第c个二维矩阵,下标c表示channel。)

这里写图片描述 

Squeeze:

公式即为一个global average pooling(原则上也可以采用其他聚合方法):

这一步将H*W*C的输入转换成1*1*C的输出,这一步的结果相当于得到该层C个feature map的数值分布情况,或者叫全局信息。

这里写图片描述

Excitation:

先用W1乘以z,就是一个全连接层操作,W1的维度是C/r * C,这个r是一个缩放参数,在文中取的是16,这个参数的目的是为了减少channel个数从而降低计算量。又因为z的维度是1*1*C,所以W1z的结果就是1*1*C/r;然后再经过一个ReLU层,输出的维度不变;然后再和W2相乘,和W2相乘也是一个全连接层的过程,W2的维度是C*C/r,因此输出的维度就是1*1*C;最后再经过sigmoid函数,得到s。

 这里写图片描述

 最后得到的s的维度是1*1*C,C表示channel数目。这个s其实是本文的核心,它是用来刻画tensor U中C个feature map的权重。而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。这两个全连接层的作用就是融合各通道的feature map信息,因为前面的squeeze都是在某个channel的feature map里面操作。其中整个操作可以看成学到了各个channel的权重系数,使得模型对各个 channel 的特征更有辨识能力,

Fscale:
得到s之后,就可以对原来的tensor U操作了,就是channel-wise multiplication,U_{c}是一个二维矩阵,S_{C}是权重,因此相当于把U_{c}矩阵中的每个值都乘以S_{C}

这里写图片描述

将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

3. 应用

 SE模块的灵活性在于它可以直接应用现有的网络结构中。

这里以 Inception和ResNet为例。对于 Inception网络,没有残差网络,这里对整个Inception模块应用SE模块。对于ResNet,SE模块嵌入到残差结构中的残差学习分支中,如下图所示:

使用global average pooling作为Squeeze操作。紧接着两个Fully Connected组成一个Bottleneck结构去建模通道间的相关性,并输出和输入特征同样数目的权重。

SE-Inception Module:我们首先将特征维度降低到输入的 1/16(即缩放系数r=16),然后经过 ReLu 激活后再通过一个Fully Connected升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于具有更多的非线性,可以更好地拟合通道间复杂的相关性;极大地减少了参数量和计算量。然后通过一个Sigmoid获得 0~1 之间归一化的权重,最后通过一个Scale的操作来将归一化后的权重加权到每个通道的特征上。

SE-ResNet Module:上右图是将SE嵌入到ResNet模块中的例子,操作过程基本和SE-Inception一样,只不过是在Addition前对分支上Residual的特征进行了特征重标定。如果对Addition后主支上的特征进行重标定,由于在主干上存在0~1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。

参数量:

 添加了SE block后,增加的参数主要来自两个全连接层,两个全连接层的维度都是C/r * C,那么这两个全连接层的参数量就是2*C^2/r。以ResNet为例,假设ResNet一共包含S个stage,每个Stage包含N个重复的residual block,那么整个添加了SE block的ResNet增加的参数量为:

这里写图片描述

目前大多数的主流网络都是基于这两种类似的单元通过重复方式叠加来构造的。由此可见,SE模块可以嵌入到现在几乎所有的网络结构中。

通过在原始网络结构的building block单元中嵌入SE模块,我们可以获得不同种类的SENet。如SE-BN-Inception,SE-ResNet,SE-ReNeXt,SE-Inception-ResNet-v2等。 

4. 实验 

SENet构造非常简单,很容易被部署,不需要引入新的函数或者层;除此之外,它还在模型和计算复杂度上具有良好的特性。

拿ResNet-50和SE-ResNet-50对比举例来说,SE-ResNet-50相对于ResNet-50有着10%模型参数的增长。额外的模型参数都存在于 Bottleneck 设计的两个Fully Connected中,由于ResNet结构中最后一个stage的特征通道数目为2048,导致模型参数有着较大的增长,实验发现移除掉最后一个stage中3个build block上的SE设定,可以将10%参数量的增长减少到 2%。此时模型的精度几乎无损失。

另外,由于在现有的GPU实现中,都没有对global pooling和较小计算量的Fully Connected进行优化,这导致了在GPU上的运行时间SE-ResNet-50相对于ResNet-50有着约 10% 的增长。尽管如此,其理论增长的额外计算量仅仅不到1%,这与其在 CPU 运行时间上的增长相匹配(~2%)。可以看出,在现有网络架构中嵌入 SE 模块而导致额外的参数和计算量的增长微乎其微。

验证 SENets 的有效性:论文在ImageNet数据集上进行了实验,并从两个方面来进行论证:一个是性能的增益vs网络的深度; 另一个是将 SE 嵌入到现有的不同网络中进行结果对比 。

下表为网络的深度对SE的影响:表格分别展示了ResNet-50、ResNet-101、ResNet-152和嵌入 SE 模型的结果。第一栏Original是原作者实现的结果,为了进行公平的比较,我们在ROCS(作者自己优化的分布式训练系统 )上重新进行了实验得到Our re-implementation的结果。最后一栏SE-module是指嵌入了 SE 模块的结果,它的训练参数和第二栏Our re-implementation一致。括号中的红色数值是指相对于Our re-implementation的精度提升的幅值。

下图展示了ResNet-50和ResNet-152以及它们对应的嵌入 SE 模块的网络在 ImageNet 上的训练过程,可以明显地看出加入了 SE 模块的网络收敛到更低的错误率上。 

验证 SE 模块的泛化能力:作者在除ResNet以外的结构上进行了实验。

从下表可以看出,将SE模块嵌入到ResNeXt、BN-Inception、Inception-ResNet-v2上均获得了不错的增益效果。由此看出,SE的增益效果不仅仅局限于某些特殊的网络结构,它具有很强的泛化性。 

  下图为SE嵌入在ResNeXt-50和Inception-ResNet-v2的训练过程对比:

下表是在ImageNet分类上的网络的结果。其中SENet实质上是一个SE-ResNeXt-152(64x4d),在ResNeXt-152上嵌入SE模块,并做了一些其他修改和训练优化上的小技巧。

在 ILSVRC 2017 竞赛中,我们的融合模型在测试集上获得了 2.251% Top-5 错误率,作者团队为WMW。

5. 实现

SE-Inception Net架构的原理图:

实现过程:在Inception中是在每个Inception的后面连上一个SENet,下图的上面一半就是一个Inception,下面一半就是一个SENet,然后这个SENet下面又连着一个新的Inception。 

这里写图片描述 SEResNet 架构的原理图:

实现过程:在ResNet中都是在Residual block中嵌入SENet。下图最左边的长条连线是原来Residual block的skip connection,右下角的conv2_2_global_pool到conv2_2_prob以及左边那条连线都是SENet。不过也是用两个1*1卷积代替文中的两个全连接层。

这里写图片描述

参考:

Momenta详解ImageNet 2017夺冠架构SENet 

别人的代码地址 

仅为学习记录,侵删! 

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖虎记录学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值