SENet

参考:https://zhuanlan.zhihu.com/p/47494490

            http://www.sohu.com/a/161633191_465975/

我们从最基本的卷积操作开始说起。近些年来,卷积神经网络在很多领域上都取得了巨大的突破。而卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

然而去学到一个性能非常强劲的网络是相当困难的,其难点来自于很多方面。最近很多工作被提出来从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;在 Inside-Outside 网络中考虑了空间中的上下文信息;还有将 Attention 机制引入到空间维度上,等等。这些工作都获得了相当不错的成果。

我们可以看到,已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?我们的工作就是基于这一点并提出了 Squeeze-and-Excitation Networks(简称 SENet)。在我们提出的结构中,Squeeze 和 Excitation 是两个非常关键的操作,所以我们以此来命名。我们的动机是希望显式地建模特征通道之间的相互依赖关系。另外,我们并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征

SENet的提出动机非常简单,传统的方法是将网络的Feature Map等权重的传到下一层,SENet的核心思想在于建模通道之间的相互依赖关系,通过网络的全局损失函数自适应的重新矫正通道之间的特征相应强度

SENet由一些列SE block组成,一个SE block的过程分为Squeeze(压缩)和Excitation(激发)两个步骤。其中Squeeze通过在Feature Map层上执行Global Average Pooling得到当前Feature Map的全局压缩特征向量,Excitation通过两层全连接得到Feature Map中每个通道的权值,并将加权后的Feature Map作为下一层网络的输入。从上面的分析中我们可以看出SE block只依赖与当前的一组Feature Map,因此可以非常容易的嵌入到几乎现在所有的卷积网络中。论文中给出了在当时state-of-the-art的Inception[2]和残差网络[3]插入SE block后的实验结果,效果提升显著。

SENet虽然引入了更多的操作,但是其带来的性能下降尚在可以接受的范围之内,从GFLOPs,参数数量以及运行时间的实验结果上来看,SENet的损失并不是非常显著。

1.1. SE Block

一个SE Block的结构如图1所示

网络的左半部分是一个传统的卷积变换,忽略掉这一部分并不会影响我们的SENet的理解。我们直接看一下后半部分,其中U是一个 W*H*C 的Feature Map, W*H是图像的尺寸, C是图像的通道数。

经过 Fsq(.)(Squeeze操作)后,图像变成了一个 1*1*C的特征向量,特征向量的值由 U确定。经过 Fex(.,W)后,特征向量的维度没有变,但是向量值变成了新的值。这些值会通过和 U 的 Fscale(.,.) 得到加权后的 \widetilde{X} 。 \widetilde{X} 和 U 的维度是相同的。

 

1.2. Squeeze

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

Squeeze部分的作用是获得Feature Map U 的每个通道的全局信息嵌入(特征向量)。在SE block中,这一步通过VGG中引入的Global Average Pooling(GAP)实现的。也就是通过求每个通道 c,c\epsilon{1,C} 的Feature Map的平均值:

通过GAP得到的特征值是全局的(虽然比较粗糙)。另外, Zc 也可以通过其它方法得到,要求只有一个,得到的特征向量具有全局性。

 

1.3. Excitation

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

Excitation部分的作用是通过 Zc 学习 C 中每个通道的特征权值,要求有三点:

  1. 要足够灵活,这样能保证学习到的权值比较具有价值;
  2. 要足够简单,这样不至于添加SE blocks之后网络的训练速度大幅降低;
  3. 通道之间的关系是non-exclusive的,也就是说学习到的特征能够激励重要的特征,抑制不重要的特征。

根据上面的要求,SE blocks使用了两层全连接构成的门机制(gate mechanism)。门控单元 s(即图1中  1*1*C 的特征向量)的计算法方式表示为:

其中 \delta 表示ReLU激活函数, \sigma 表示sigmoid激活函数。 W1\epsilonR^{\frac{C}{r}*C} , W_{2}\epsilon R^{C*\frac{C}{r}}分别是两个全连接层的权值矩阵。  则是r中间层的隐层节点数,论文中指出这个值是16。

 

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

得到门控单元 s 后,最后的输出  \widetilde{X}表示为  s 和 U 的向量积,即图1中的 Fscale(.,.) 操作:

其中 \widetilde{x_{c}} 是 \widetilde{X} 的一个特征通道的一个Feature Map, Sc 是门控单元 S (是个向量)中的一个标量值。

以上就是SE blocks算法的全部内容,SE blocks可以从两个角度理解:

  1. SE blocks学习了每个Feature Map的动态先验;
  2. SE blocks可以看做在Feature Map方向的Attention,因为注意力机制的本质也是学习一组权值。

1.4. SE-Inception 和 SE-ResNet

SE blocks的特性使其能够非常容易的和目前主流的卷及结构结合,例如论文中给出的Inception结构和残差网络结构,如图2。结合方式也非常简单,只需要在Inception blocks或者Residual blocks之后直接接上SE blocks即可。

这里我们使用 global average pooling 作为 Squeeze 操作。紧接着两个 Fully Connected 层组成一个 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重,最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。

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

目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。如 SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2 等等。

 

2. SENet的复杂性分析

SENet的本质是根据Feature Map的值学习每个Feature Map的权值。 U 往往是一个由几万个节点值组成的三维矩阵,但是我们得到的 s却只有 C 个值,这种 H*W 程度的压缩是具有非常大的可操作性的。例如将 U 展开成 (W*H*C)*1 的特征向量,然后再通过全连接得到 s ,这也是目前主流的Feature Map到FC的连接方式(Flatten()操作)。而且这种方式得到的 s 往往也是效果优于SE blocks的策略的。但是SENet没这么做,他的原因是SENet是可以添加到网络中的任意一层之后的,而全连接操作往往是整个网络结构的性能瓶颈,尤其是当网络的节点数非常多时。

论文中主要对比了ResNet-50以及在其中的每一层之后添加了SE blocks之后的在运行性能的各方面的指标:

从计算性能的方向分析:ResNet-50需要约3.86GFLOPS,而SE-ResNet-50仅仅多了0.01个GFLOPS。

从预测速度上来看,运行一个ResNet-50的时间是190ms,SE-ResNet-50的运行时间约209ms,多了10%。

从参数数量上来看,SE-ResNet-50比ResNet-50的2500万个参数多了约250万个,约占10%。而且作者发现ResNet-50的最后几层的SE blocks可以省掉,但是性能影响并不大,这样的网络参数仅多了4%。

3. 总结

SENet的思想非常简单,即通过Feature Map为自身学习一个特征权值,通过单位乘的方式得到一组加权后的新的特征权值。使用的网络结构则是先GAP再接两层全连接的方式得到的权值向量。方法虽然简单,但是非常实用,并在ImageNet-2017上取得了非常优异的比赛成绩。

第2节对复杂性的分析引发了我们队SE blocks的进一步联想:如何在计算量和性能之间进行权衡?

下面是我的几点思考:

  1. 先通过RoI Pooling得到更小的Feature Map(例如 ​​​​​​​3*3),在展开作为全连接的输入;
  2. 在网络的深度和隐层节点的数目进行权衡,究竟是更深的网络效果更好还是更宽的网络效果更好;
  3. 每一层的SE blocks是否要一定相同,比如作者发现浅层更需要SE blocks,那么我们能否给浅层使用一个计算量更大但是性能更好的SE block,而深层的SE blocks更为简单高效,例如单层全连接等。

Reference

[1] Hu J, Shen L, Sun G. Squeeze-and-excitation networks[J]. arXiv preprint arXiv:1709.01507, 2017, 7.

[2] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions. In CVPR, 2015.

[3] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

发布于 2018-10-23

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值