简介

论文地址:https://arxiv.org/abs/1709.01507
代码地址:https://github.com/hujie-frank/SENet
https://github.com/moskomule/senet.pytorch/

2019 年:Squeeze-and-Excitation Networks(SENet),是 ILSVRC 2017 分类比赛的冠军网络,由牛津大学学者提出,该论文提出 SE Block 的概念,用显式的模块学习通道的重要性权重,本质上是一个基于通道的 Attention(注意力机制) 模型,它通过建模各个特征通道的重要程度,然后针对不同的任务增强或者抑制不同的通道。

SE Block

**
原理图如下:

SENet.png

结构简图如下:

image.png

  • 卷积神经网络之-SENet(通道注意力机制) - 图3 可以是普通的卷积模块,也可以是 residual block(残差块) 或者 Inception block,X(代表输入或者某一层的特征图) 经过 卷积神经网络之-SENet(通道注意力机制) - 图4 变换后,得到 U。
  • 卷积神经网络之-SENet(通道注意力机制) - 图5 类似于一个全局池化的操作 卷积神经网络之-SENet(通道注意力机制) - 图6卷积神经网络之-SENet(通道注意力机制) - 图7 代表特征图 U 上 c 通道 i 行 j 列的像素值。得到的结果是一个 1×1×C 的向量。
  • 卷积神经网络之-SENet(通道注意力机制) - 图8 的具体操作用公式 卷积神经网络之-SENet(通道注意力机制) - 图9 来表示,相当于两层的全连接网络,网络学习的权重分别是 W1 和 W2,其中 δ 是 ReLU 函数,σ 是 Sigmoid 函数,z 是 卷积神经网络之-SENet(通道注意力机制) - 图10 得到的 1×1×C 结果。这样的操作,可以让捕获通道之间的相关性并学习通道之间的非线性关系。
  • 卷积神经网络之-SENet(通道注意力机制) - 图11 操作下有一个参数 reduction(结构简图中的 r),这个参数用来设计一个瓶颈结构,相当于把通道进行压缩后再还原,如下图所示(相当于压缩了 4 倍),在代码中可以很直白的看出来。

Untitled Diagram (1).jpg

  • 卷积神经网络之-SENet(通道注意力机制) - 图13 的操作是将训练得到的 11C 向量(原理图中的彩色的 1×1×C 向量)变成 H×W×C,并与特征图 U 对应通道做乘法。


代码实现

  1. from torch import nn
  2. class SELayer(nn.Module):
  3. def __init__(self, channel, reduction=16):
  4. super(SELayer, self).__init__()
  5. self.avg_pool = nn.AdaptiveAvgPool2d(1)
  6. self.fc = nn.Sequential(
  7. nn.Linear(channel, channel // reduction, bias=False),
  8. nn.ReLU(inplace=True),
  9. nn.Linear(channel // reduction, channel, bias=False),
  10. nn.Sigmoid()
  11. )
  12. def forward(self, x):
  13. b, c, _, _ = x.size()
  14. y = self.avg_pool(x).view(b, c)
  15. y = self.fc(y).view(b, c, 1, 1)
  16. return x * y.expand_as(x)