CV中的Attention机制汇总(一):SE模块

Squeeze-and-Excitation Networks

论文链接:Squeeze-and-Excitation Networks

1. 摘要

In this work, we focus instead on the channel relationship and propose a novel architectural unit, which we term the “Squeeze-and-Excitation”(SE) block,that adaptively recalibrates(重新校准)channel-wise feature responses by explicitly modelling interdependencies between channels.
SE模块属于通道注意力机制,可以自适应学习不同通道之间的依赖关系。

2. SE模块详细理解

原文中给出的SE模块图例如下:

结合论文第3节的内容对以下两个问题进行详细理解:

  • SE模块是如何学习不同通道之间的依赖关系的?
  • SE模块是如何利用通道信息引导模型对特征进行有区分度的加权学习的?

2.1 多输入与多输出通道

图1中①部分描述了多输入与多输出通道的卷积层.
多输入通道:输入特征图的每个通道都对应一个二维卷积核,所有输入通道的卷积结果之和为最后的卷积结果,如下图所示(为了简便描述,省略了偏差):

式中,CCC表示第CCC个输出通道,SSS表示第SSS个输入通道。
每个输入通道均对应一个二维卷积核,所以:三维卷积核的通道数=输入特征图的通道数.

2.2 多输出通道


每个输出通道对应独立的三维卷积核,因此,输出特征图的通道数=三维卷积核的个数。通常,输出通道数是超参数。

根据多输入与多输出通道的原理,我们不难理解在常规的卷积计算中,不同输入通道之间的关联性隐藏于每个输出通道中,且仅采用“相加”这一简单的方式,而不同的输出通道对应于独立的三维卷积核,因此,输入通道之间的关联性没有得到合理的利用。

因此论文作者提出SE模块来显式地利用不同输入通道之间的信息。

2.3 Squeeze-and-Excitation Block

2.3.1 Squeeze: Global Information Embedding

作者采用全局平均汇聚(Global Average Pooling)得到每个通道的信息。
zc=Fsq(uc)=1H×W∑i=1H∑j=1Wuc(i,j)z_c=\bold F_{sq}(\bold u_c)=\frac{1}{H\times W}\sum_{i=1}^{H} \sum_{j=1}^{W}u_c(i,j) zc=Fsq(uc)=H×W1i=1Hj=1Wuc(i,j)

为什么这么做?原文中解释道:

Each of the learned filters operates with a local receptive field and consequently each unit of the transformation output UUU is unable to exploit contextual information outside of this region.
在一张大小为H×WH\times WH×W的特征图中,每个元素仅对应输入特征图中的某个局部区域(即感受野),因此输出特征图中的每个元素仅包含了局部信息而不是全局信息。

To mitigate this problem, we propose to squeeze global spatial information into a channel descriptor. This is achieved by using global average pooling to generated chanel-wise statistics.
作者采用全局平均汇聚得到每个通道的全局特征,目的是为了融合局部信息得到全局信息,之所以采用全局平均汇聚是因为实现简单,也可以采用其他更为精细但复杂的操作。

2.3.2 Excitation: Adaptive Recaloibration

Excitation(激励)模块是为了更好地得到各个通道之间的依赖关系,需要满足两个要求:

  • 可以学习各个通道之间的非线性关系;
  • 可以保证每个通道都有对应的输出,得到soft-label,而不是one-hot型向量。
    因此,作者使用了两个全连接层学习非线性关系,最后使用sigmoid激活函数。
    并且为了降低模型参数和复杂度,采用了“bottleneck”思想设计全连接层,随之产生一个超参数:rrr,文中令r=16r=16r=16

关于为什么使用sigmoid函数的思考?\color{red}{关于为什么使用sigmoid函数的思考?}使sigmoid

sigmoid是常见的激活函数之一,SE模块最后的输出相当于学习到的每个通道的权重,首先要保证权重不能为0,为0的话反而会损失大量信息,因此不能使用ReLU;另外,这里想要得到范围在[0,1][0,1][0,1]的权重,而不是为了突出某一个通道,有别于“多类别分类”问题,更像“多标签分类”问题,因此这里使用softmax函数是不合适的。

Excitation模块公式表示:
s=Fex(x,W)=σ(g(z,W))=σ(W2δ(W1z))s=\bold F_{ex}(\bold x, \bold W)=\sigma(g(\bold z,\bold W))=\sigma(\bold W_2\delta(W_1 \bold z)) s=Fex(x,W)=σ(g(z,W))=σ(W2δ(W1z))
式中,δ(∙)\delta(\bullet)δ()表示ReLU激活函数,σ(∙)\sigma(\bullet)σ()表示sigmoid激活函数。

2.3.3 加权

最后将SE模块的输出作用于卷积层的输出,得到通道注意力加权的输出特征图。

使用得到的channel-wise向量,对每个通道的特征图的每个元素作加权(理解公式(4)后面是标量与矩阵的乘积)。

3. SE模块的使用

三、PyTorch实现SE模块

3.1 使用全连接层实现Excitation

class SE(nn.Module):def __init__(self, channels, reduction=16): # 这里默认为16,如果特征图通道数较小,可以适当调整super(SE, self).__init__()self.squeeze = nn.AdaptiveAvgPool2d((1, 1))self.excitation = nn.Sequential(nn.Linear(channels, channels // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channels // reduction, channels, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.squeeze(x).view(b, c)y = self.excitation(y).view(b, c, 1, 1)return x * y.expand_as(x)

3.2 使用1×11\times 11×1卷积实现Excitation

使用1×11\times 11×1卷积代替全连接层,避免矩阵与向量之间的维度转换

class SE(nn.Module):def __init__(self, channels, reduction=2):super(SE, self).__init__()self.squeeze = nn.AdaptiveAvgPool2d((1, 1))self.excitation = nn.Sequential(nn.Conv2d(channels, channels // reduction, kernel_size=1, stride=1, padding=0, bias=False),nn.ReLU(inplace=True),nn.Conv2d(channels // reduction, channels, kernel_size=1, stride=1, padding=0, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.squeeze(x)print(y.shape)y = self.excitation(y)print(y.shape)return x * y

深入理解CV中的Attention机制之SE模块相关推荐

  1. CV中的attention机制之(cSE,sSE,scSE)

    CV中的attention机制之(cSE,sSE,scSE) 论文 代码 SE模块的博文链接 提出scSE模块论文的全称是:<Concurrent Spatial and Channel 'Sq ...

  2. CV中的Attention机制总结

    CV中的Attention机制 注意力机制 CV中的注意力机制 卷积神经网络中常用的Attention 视觉注意力机制在分类网络中的应用 SE-Net(CVPR 2017) ECA-Net(CVPR ...

  3. 一文深入浅出cv中的Attention机制

    在深度学习领域中,存在很多专业名词,第一次看的时候总会很懵逼-后面慢慢看得时候才会有那么感觉,但是总觉得差点意思.今天我们要说的一个专业名词,就叫做Attention机制! 1. 直观理解Attent ...

  4. 通道注意力机制 cnn keras_【CV中的Attention机制】简单而有效的CBAM模块

    前言: CBAM模块由于其使用的广泛性以及易于集成得到很多应用.目前cv领域中的attention机制也是在2019年论文中非常火.这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领 ...

  5. 【CV中的Attention机制】模块梳理合集

    文章目录 0. 总述 1. SENet(CVPR18) 2. SKNet(CVPR19) 3. CBAM(ECCV18)&BAM(BMVC18)&scSE(MICCAI18) 4. N ...

  6. 【从零开始学习YOLOv3】7. 教你在目标检测中添加Attention机制

    前言:[从零开始学习YOLOv3]系列越写越多,本来安排的内容比较少,但是在阅读代码的过程中慢慢发掘了一些新的亮点,所以不断加入到这个系列中.之前都在读YOLOv3中的代码,已经学习了cfg文件.模型 ...

  7. 理解LSTM/RNN中的Attention机制

    转自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! 导读 目前采用编码器-解码器 (Encode-Decode) 结构的 ...

  8. 万字长文解析CV中的注意力机制(通道/空间/时域/分支注意力)

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[transformer综述]获取2022最新ViT综述论文! 注意 ...

  9. 「NLP」 聊聊NLP中的attention机制

    https://www.toutiao.com/i6716536091681227267/ 本篇介绍在NLP中各项任务及模型中引入相当广泛的Attention机制.在Transformer中,最重要的 ...

最新文章

  1. Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
  2. linux内核杂记(6)-进程调度(1)
  3. 比乐高便宜十倍!4合1电动遥控积木玩法百变
  4. 计算机应用基础形考作业3Excel部分,计算机应用基础形考3,Excel部分
  5. Android沉浸式通知栏设计
  6. 主板定制 如何定制主板这些流程要知道
  7. jsp后台页面登录html代码,炫酷的登录jsp页面完整代码
  8. 最新emoji表情代码大全_微信表情包大全 百度输入法让你斗图斗到爽
  9. 正交幅度调制(QAM)信号的产生与解调介绍及matlab实现
  10. 如何在Word文档中制作三线表
  11. android+发短信示例,【Android】如何实现Android发送短信(示例代码)
  12. python求一元二次方程解
  13. python中render是什么意思_Django中render_to_response和render的区别(转载)
  14. OSChina 周二乱弹 —— 掏心掏肺又掏钱,最终娶了个潘金莲
  15. CVPR2019|Depth-Aware Video Frame Interpolation【论文阅读笔记】
  16. html 图片自动滚动播放,CSS3如何实现图片滚动播放效果(附代码)_WEB前端开发...
  17. 如何理解DevOps
  18. 怎样在普通java项目中使用aspectj
  19. 宿舍管理系统(Java毕业设计)
  20. 报错ValueError: row index was 65536, not allowed by .xls format

热门文章

  1. python每隔5秒执行一次
  2. 爱情配对测试缘分指数软件,爱情配对测试缘分指数,测试男女两个人姓名配
  3. 3d文本样式cssjs特效代码
  4. linux系统时间获取方式
  5. Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)
  6. 测试策略和测试计划的区别
  7. php phpqrcode 生成二维码
  8. 罗斯蒙特3051差压变送器
  9. 1-out-2 OT
  10. PyQt5学习(7):打印Qprinter