1、引言
论文链接:Squeeze-and-Excitation Networks (thecvf.com)
为了提高 CNN(convolutional neural network) 的表示能力,最近的几种方法已经显示出增强空间编码的好处。而 Jie Hu[1] 等专注于通道关系并提出了 SE(Squeeze and Excitation) 块,它通过显式建模通道之间的相互依赖关系来自适应地重新校准通道特征响应。将 SE 块引入到某个网络中就得到对应的 SENet(Squeeze-and-Excitation Networks)[1],如在 ResNet-50[2] 的每个 Bottleneck 中引入 SE 块就得到 SE-ResNet-50[1]。SE 块以微小的额外计算成本对现有最先进的深度架构产生了显着的性能改进,Jie Hu[1] 等因此而获得了 ILSVRC 2017 分类任务的第一名。
2、方法
图1 挤压-激励块
如图 1 所示,所谓的 SE 块主要由 Fsq(.)(挤压操作)和 Fex(., W)(激励操作)组成,假设SE 块的输入特征 U 的 shape=(C, H, W),经过 Fsq(.) 后 shape 变为 (C, 1, 1),再经过 Fex(., W) 后得到 U 的通道权重 S,最后执行 Fscale(., .),即 U*S 得到 SE 块的输出。
图2 原始残差模块(左)和 SE-ResNet 模块(右)的模式
SE 块的细节如图 2(右)所示,可以看到 Fsq(.)= AdaptiveAvgPool,而 Fex(., W) 主要由两个 Linear 层组成:对于 shape=(C, 1, 1) 的输入 X,首先由一个 Linear 层将其通道数降为原来的 1/r,然后是一个 ReLU 层,再由一个 Linear 层将通道数恢复,最后经过 Sigmoid 激活得到 X 的通道权重 S。
3、总结
[1] 中提出了可以通过动态通道特征重新校准来提高网络的表示能力的 SE 块。SENet 在多个数据集上达到 SOTA,是通道注意力机制的代表模型;此外,SE块还揭示了先前架构无法充分建模通道特性依赖关系的问题;最后,SE 块引起的特征重要性可能有助于相关领域,例如用于压缩的网络修剪。
作者公开的代码和模型在:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Networks,由于该代码基于 Caffe 实现,故本人基于 Pytorch 实现了 SE 块如下所示:
from torch import nn
__all__ = ['SENet']
class SENet(nn.Module):
def __init__(self, in_c, ratio=16):
super().__init__()
self.squeeze = nn.AdaptiveAvgPool2d(1)
self.excitation = nn.Sequential(
nn.Conv2d(in_c, in_c // ratio, kernel_size=1, bias=False),
nn.ReLU(True),
nn.Conv2d(in_c // ratio, in_c, kernel_size=1, bias=False),
nn.Sigmoid()
)
def forward(self, x):
z = self.squeeze(x)
w = self.excitation(z)
return x * w
参考文献
[1] Jie Hu, Li Shen, and Gang Sun. Squeeze-and-Excitation Networks. In CVPR, 2018.
[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep Residual Learning for Image Recognition. In CVPR, 2016.