计算机视觉学习分享

【CV中的Attention机制】最简单最易实现的SE模块

2020-01-16  本文已影响0人  pprpp

1. Squeeze-and-Excitation Network

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

image

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

image

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. 实验

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

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

4. Reference

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

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

核心代码:https://github.com/pprp/SimpleCVReproduction/blob/master/attention/SE/senet.py

上一篇下一篇

猜你喜欢

热点阅读