程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Attention之SENet

balukai 2025-01-15 10:47:15 文章精选 10 ℃

1. Squeeze-and-Excitation Network

SENet 是 Squeeze-and-Excitation Networks 的简称,拿到了 ImageNet2017 分类比赛冠军,其效果得到了认可,其提出的 SE 模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet 主要是学习了 channel 之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。

通过上图可以理解他的实现过程,通过对卷积得到的 feature map 进行处理,得到一个和通道数一样的一维向量作为每个通道的评价分数,然后将该分数分别施加到对应的通道上,得到其结果,就在原有的基础上只添加了一个模块,下边我们用 pytorch 实现这个很简单的模块。

2. 代码

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

3. 实验

虽然核心就是以上的内容,不过不能简单地结束,我们需要看一下以下几个点:

  • 作为一个重要的 attention 机制的文章,这篇文章如何描述 attention,related work 如何组织?attention 机制当时已经有一定的研究和发展,也是集中于序列学习,image captioning, understanding in images 这些工作,也已经有很多出色的工作是探索了 attention 机制。senet 这篇文章主要探索了通过对通道间关系进行建模来提升模型的表达能力。related work 主要从更深的网络架构,架构搜索,注意力机制三个角度进行了梳理,确实非常全面。
  • 如何解释 SE 模块?Sequeeze:对C×H×WC×H×W 进行 global average pooling,得到 1×1×C1×1×C 大小的特征图,这个特征图可以理解为具有全局感受野。Excitation :使用一个全连接神经网络,对 Sequeeze 之后的结果做一个非线性变换。特征重标定:使用 Excitation 得到的结果作为权重,乘到输入特征上。
  • SE 模块如何加到分类网络,效果如何?分类网络现在一般都是成一个 block 一个 block,se 模块就可以加到一个 block 结束的位置,进行一个信息 refine。这里用了一些 STOA 的分类模型如:resnet50,resnext50,bn-inception 等网络。通过添加 SE 模块,能使模型提升 0.5-1.5%, 效果还可以,增加的计算量也可以忽略不计。在轻量级网络 MobileNet,ShuffleNet 上也进行了实验,可以提升的点更多一点大概在 1.5-2%。
  • SE 模块如何加到目标检测网络,效果如何?主要还是将 SE 模块添加到 backbone 部分,优化学习到的内容。目标检测数据集使用的是 benchmark MSCOCO, 使用的 Faster R-CNN 作为目标检测器,使用 backbone 从 ResNet50 替换为 SE-ResNet50 以后带了了两个点的 AP 提升,确实有效果。
  • 这篇文章的实验部分是如何设置的?这篇文章中也进行了消融实验,来证明 SE 模块的有效性,也说明了设置 reduction=16 的原因。squeeze 方式:仅仅比较了 max 和 avg,发现 avg 要好一点。excitation 方式:使用了 ReLU,Tanh,Sigmoid,发现 Sigmoid 好。stage: resnet50 有不同的阶段,通过实验发现,将 se 施加到所有的阶段效果最好。集成策略:将 se 放在残差单元的前部,后部还是平行于残差单元,最终发现,放到前部比较好。
  • 如何查看每个通道学到的 attention 信息并证明其有效性?作者选取了 ImageNet 中的四个类别进行了一个实验,测试 backbone 最后一个 SE 层的内容,如下图所示:

可以看出这两个类激活出来的内容有一定的差距,起到了一定的作用。

4. Reference

论文地址:https://arxiv.org/abs/1709.01507

代码参考地址:https://github.com/moskomule/senet.pytorch

Tags:

最近发表
标签列表