【CV中的Attention机制】SENet中的SE模块

论坛 期权论坛 爱问     
wrg4i   2022-6-3 15:09   5773   20
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:对 进行global average pooling,得到 大小的特征图,这个特征图可以理解为具有全局感受野。
    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

论文地址:
代码参考地址:
核心代码:
分享到 :
0 人收藏

20 个回复

倒序浏览
2#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-6-3 15:09:55 发帖IP地址来自 北京交通大学
总结的蛮好的 赞一个
3#
qvpjj  1级新秀 | 2022-6-3 15:10:40 发帖IP地址来自 辽宁盘锦
[感谢]
4#
hb_hc  1级新秀 | 2022-6-3 15:11:31 发帖IP地址来自 中国
实现代码比想象中少很多,20行不到
[吃瓜]
5#
asdgp  1级新秀 | 2022-6-3 15:12:20 发帖IP地址来自 北京
的确是的。
6#
p5d5t  1级新秀 | 2022-6-3 15:13:17 发帖IP地址来自 中国
是对channel赋值?那是不是单通道图片就不能用这种方法了
7#
Harry  1级新秀 | 2022-6-3 15:13:37 发帖IP地址来自 中国
单通道可以,se并不是直接作用于图片,是对tensor进行作用的
8#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-6-3 15:14:09 发帖IP地址来自 北京
代码里两个linear后面需要跟bn吗,差别是什么?
9#
00slp  1级新秀 | 2022-6-3 15:14:33 发帖IP地址来自 北京航空航天大学
为什么要用BN呢?你想,使用了bn以后就是整个batch的均值了,那就无法单独作用于每张图片了。
10#
周杰伦  5级知名  期权交易,唯快不破 | 2022-6-3 15:15:22 发帖IP地址来自 北京
看原论文吧,这篇主要偏实践,理论性不强
11#
ziab6  1级新秀 | 2022-6-3 15:15:33 发帖IP地址来自 北京
博主,SE模块我用到YOLO上为啥子效果会变差呢
12#
o9ma  1级新秀 | 2022-6-3 15:16:05 发帖IP地址来自 中国
跟数据集和调参有一定关系
13#
neilxu  1级新秀 | 2022-6-3 15:16:42 发帖IP地址来自 中国
调一下参
14#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-6-3 15:17:08 发帖IP地址来自 北京大学医学部
这里的channel不是指的图片的三通道,是指的经过前面一层的输出的channel吧?
15#
mvn00  1级新秀 | 2022-6-3 15:17:14 发帖IP地址来自 北京航空航天大学
是的
16#
b9rt  1级新秀 | 2022-6-3 15:17:46 发帖IP地址来自 中国
可是reduction还有啥能调的呢?疑惑
17#
7v007  1级新秀 | 2022-6-3 15:17:51 发帖IP地址来自 中国
您好楼主, 想问下如果使用了SE, 在前几个epochs P R都会提升较快, 但最终的精度似乎提升不大, 这是什么原因呢.
18#
a2uns  1级新秀 | 2022-6-3 15:18:08 发帖IP地址来自 中国
需要调参的,建议看看原论文中的实验设置
19#
0gn3t  1级新秀 | 2022-6-3 15:18:34 发帖IP地址来自 CNNIC
通俗易懂,极易吸收,谢谢楼主,我看懂了[赞同]
20#
dairuihongye  1级新秀 | 2022-6-3 15:19:14 发帖IP地址来自 北京大学医学部
[赞同](ω)
21#
bestlfc  1级新秀 | 2022-6-3 15:20:04 发帖IP地址来自 云南
作者大哥,请教一下代码前向里的:b,c,_, _这种写法什么意思呢?还有后边得到权重的时候,用view(b,c,1,1),为什么view能用4个参数啊[大哭]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP