SE注意⼒模块
⼀、SE 模块的结构
SE 模块主要包含 Squeeze 和 Excitation 两部分。W,H 表⽰特征图宽,⾼。C 表⽰通道数,输⼊特征图⼤⼩为 W×H×C。
1、压缩(Squeeze)
第⼀步是压缩(Squeeze)操作,如下图所⽰:
这个操作就是⼀个全局平均池化(global average pooling)。经过压缩操作后特征图被压缩为1×1×C向量。
2、激励(Excitation)
接下来就是激励(Excitation)操作,如下图所⽰:
由两个全连接层组成,其中SERatio是⼀个缩放参数,这个参数的⽬的是为了减少通道个数从⽽降低计算量。
第⼀个全连接层有C*SERatio个神经元,输⼊为1×1×C,输出1×1×C×SERadio。
第⼆个全连接层有C个神经元,输⼊为1×1×C×SERadio,输出为1×1×C。
3、scale 操作
最后是 scale 操作,在得到 1×1×C 向量之后,就可以对原来的特征图进⾏ scale 操作了。很简单,就是通道权重相乘,原有特征向量为W×H×C,将SE模块计算出来的各通道权重值分别和原特征图对应通道的⼆维矩阵相乘,得出的结果输出。
这⾥我们可以得出SE模块的属性:
参数量 = 2×C×C×SERatio
计算量 = 2×C×C×SERatio
总体来讲SE模块会增加⽹络的总参数量,总计算量,因为使⽤的是全连接层计算量相⽐卷积层并不⼤,但是参数量会有明显上升
⼆、SE 模块的结构
SE 模块根据注意的⽅⾯不同分为通道注意⼒ CAM 和空间注意了 SAM,⼀个关注“what”,⼀个关注“where”,两者可以并⾏或者串⾏使⽤。女巫集会
1、通道注意⼒ CAM
通道注意⼒通过混合通道维度的信息来进⾏特征提取。
对于输⼊的 feature map F,⾸先在每个空间位置上应⽤ MaxPooling、AvgPooling,得到两个 C11 的向量,然后分别送⼊⼀个共享的包含两层 FC 的 MLP,最后将两者相加融合,经过⼀个激活函数,得到通道注意⼒ CAM,其公式表达为:
Pytorch 实现:
class ChannelAttention(nn.Module):
def__init__(lf, in_planes, ratio=16):
super(ChannelAttention, lf).__init__()
lf.avg_pool = nn.AdaptiveAvgPool2d(1)
lf.max_pool = nn.AdaptiveMaxPool2d(1)毛利额
lf.fc1 = nn.Conv2d(in_planes, in_planes //16,1, bias=Fal)bosco
factslf.fc2 = nn.Conv2d(in_planes //16, in_planes,1, bias=Fal)
lf.sigmoid = nn.Sigmoid()
def forward(lf, x):
avg_out = lf.lu1(lf.fc1(lf.avg_pool(x))))
max_out = lf.lu1(lf.fc1(lf.max_pool(x))))
atten = lf.sigmoid(avg_out + max_out)# 计算得到的注意⼒
return x * atten # 将输⼊矩阵乘以对应的注意⼒
2、空间注意⼒ SAM
tencent files⾸先在每个通道上应⽤ MaxPooling、AvgPooling,得到两个 1H W 的 feature map,然后按通道 concat 起来,送⼊⼀个标准卷积层,经过激活函数之后就得到了空间注意⼒ SAM,其公式表达为:
Pytorch 实现:
class SpatialAttention(nn.Module):
def__init__(lf, kernel_size=7):
avossuper(SpatialAttention, lf).__init__()pipe是什么意思>extended是什么意思
asrt kernel_size in(3,7),'kernel size must be 3 or 7'
padding =3if kernel_size ==7el1
lf.sigmoid = nn.Sigmoid()
def forward(lf, x):
avg_out = an(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
atten = torch.cat([avg_out, max_out], dim=1)
atten = lf.conv1(atten)# 计算得到的注意⼒
dayooatten = lf.sigmoid(atten)# 将输⼊矩阵乘以对应的注意⼒
shamelessly
return x * atten # 将输⼊矩阵乘以对应的注意⼒
3、CBAM模块(Convolutional Block Attention Module)
该注意⼒模块( CBAM ),可以在通道和空间维度上进⾏ Attention 。其包含两个⼦模块 Channel Attention Module(CAM) 和 Spartial Attention Module(SAM)。