深⼊理解CV中的Attention机制之SE模块
CV中的Attention机制汇总(⼀):SE模块
Squeeze-and-Excitation Networks
论⽂链接:
1. 摘要
In this work, we focus instead on the channel relationship and propo a novel architectural unit, which we term the “Squeeze-and-Excitation”(SE) block,that adaptively recalibrates(重新校准)channel-wi feature respons by explicitly modelling interdependencies between channels.如何理财
SE模块属于通道注意⼒机制,可以⾃适应学习不同通道之间的依赖关系。
2. SE模块详细理解
原⽂中给出的SE模块图例如下:
结合论⽂第3节的内容对以下两个问题进⾏详细理解:
SE模块是如何学习不同通道之间的依赖关系的?
SE模块是如何利⽤通道信息引导模型对特征进⾏有区分度的加权学习的?
2.1 多输⼊与多输出通道
孕妇可以吃芒果吗
图1中①部分描述了多输⼊与多输出通道的卷积层.
多输⼊通道:输⼊特征图的每个通道都对应⼀个⼆维卷积核,所有输⼊通道的卷积结果之和为最后的卷积结果,如下图所⽰(为了简便描述,省略了偏差):
每个输⼊通道均对应⼀个⼆维卷积核,所以:三维卷积核的通道数=输⼊特征图的通道数.
2.2 多输出通道
每个输出通道对应独⽴的三维卷积核,因此,输出特征图的通道数=三维卷积核的个数。通常,输出通道数是超参数。
根据多输⼊与多输出通道的原理,我们不难理解在常规的卷积计算中,不同输⼊通道之间的关联性隐藏于每个输出通道中,且仅采⽤“相加”这⼀简单的⽅式,⽽不同的输出通道对应于独⽴的三维卷积核,因此,输⼊通道之间的关联性没有得到合理的利⽤。
因此论⽂作者提出SE模块来显式地利⽤不同输⼊通道之间的信息。
2.3 Squeeze-and-Excitation Block
2.3.1 Squeeze: Global Information Embedding
作者采⽤全局平均汇聚(Global Average Pooling)得到每个通道的信息。
为什么这么做?原⽂中解释道:
Each of the learned filters operates with a local receptive field and conquently each unit of the transformation output is unable to exploit contextual information outside of this region.
在⼀张⼤⼩为的特征图中,每个元素仅对应输⼊特征图中的某个局部区域(即感受野),因此输出特征图中的每个元素仅包含了局部信息⽽不是全局信息。
To mitigate this problem, we propo to squeeze global spatial information into a channel descriptor. This is achieved by using global average pooling to generated chanel-wi statistics.
作者采⽤全局平均汇聚得到每个通道的全局特征,⽬的是为了融合局部信息得到全局信息,之所以采⽤全局平均汇聚是因为实现简单,也可以采⽤其他更为精细但复杂的操作。
2.3.2 Excitation: Adaptive Recaloibration Excitation(激励)模块是为了更好地得到各个通道之间的依赖关系,需要满⾜两个要求:可以学习各个通道之间的⾮线性关系;
可以保证每个通道都有对应的输出,得到soft-label,⽽不是one-hot型向量。
因此,作者使⽤了两个全连接层学习⾮线性关系,最后使⽤sigmoid激活函数。
趣味运动会队名并且为了降低模型参数和复杂度,采⽤了“bottleneck”思想设计全连接层,随之产⽣⼀个超参数:,⽂中令。
z =c F (u )=sq c u (i ,j )H ×W 1i =1∑H j =1∑W
c U H ×W r r =16关于为什么使⽤sigmoi
d 函数的思考?
sigmoid是常见的激活函数之⼀,SE模块最后的输出相当于学习到的每个通道的权重,⾸先要保证权重不能为0,为0的话反⽽会损失⼤量信息,因此不能使⽤ReLU;另外,这⾥想要得到范围在的权重,⽽不是为了突出某⼀个通道,有别于“多类别分类”问题,更像“多标签分类”问题,因此这⾥使⽤softmax函数是不合适的。
Excitation模块公式表⽰:
式中,表⽰ReLU激活函数,
表⽰sigmoid激活函数。
2.3.3 加权
最后将SE模块的输出作⽤于卷积层的输出,得到通道注意⼒加权的输出特征图。
蛋糕的英语单词
使⽤得到的channel-wi向量,对每个通道的特征图的每个元素作加权(理解公式(4)后⾯是标量与矩阵的乘积)。
[0,1]s =F (x ,W )=ex σ(g (z ,W ))=σ(W δ(W z ))
21δ(∙)σ(∙)
3. SE
模块的使⽤
class SE(nn.Module):
def__init__(lf, channels, reduction=16):# 这⾥默认为16,如果特征图通道数较⼩,可以适当调整super(SE, lf).__init__()
lf.squeeze = nn.AdaptiveAvgPool2d((1,1))家长对孩子的评语
nn.Linear(channels, channels // reduction, bias=Fal),
nn.ReLU(inplace=True),
nn.Linear(channels // reduction, channels, bias=Fal),
nn.Sigmoid())
def forward(lf, x):
b, c, _, _ = x.size()
y = lf.squeeze(x).view(b, c)
有关心理学的书籍y = lf.excitation(y).view(b, c,1,1)
return x * y.expand_as(x)
1×1
使⽤卷积代替全连接层,避免矩阵与向量之间的维度转换
class SE(nn.Module):
def__init__(lf, channels, reduction=2):
super(SE, lf).__init__()
lf.squeeze = nn.AdaptiveAvgPool2d((1,1))
nn.Conv2d(channels, channels // reduction, kernel_size=1, stride=1, padding=0, bias=Fal), nn.ReLU(inplace=True),
nn.Conv2d(channels // reduction, channels, kernel_size=1, stride=1, padding=0, bias=Fal), nn.Sigmoid())
def forward(lf, x):
b, c, _, _ = x.size()
y = lf.squeeze(x)
print(y.shape)
y = lf.excitation(y)
新员工述职报告print(y.shape)
return x * y
终身寿险是什么意思啊