从神经网络层面通俗来讲:注意力机制就是希望网络能够自动学出来图片或者文字序列中的需要注意的地方。比如人眼在看一幅画的时候,不会将注意力平等地分配给画中的所有像素,而是将更多注意力分配给人们关注的地方。
据本人了解目前注意力机制在**计算机视觉(CV)**上的应用主要集中于一下三种注意力方式:
上图中,首先经过正常的卷积得到U(C,H,W),然后将得到的特征图经过全局平均池化(nn.AdaptiveAvgPool2d)得到1x1xC的向量,再经过2个全连接层(nn.Linear),重置向量里的值,最后将得到的向量与U相乘。
SE-block的代码块如下所示:
from torch import nn
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)
论文中除了介绍SE模块外,还简述了SE-block与 resnet和inception的结合使用,此外,还从各个方面比较se的效果和参数量的变化。
Convolutional Block Attention Module(CBAM):主要网络架构由通道注意力机制和空间注意力机制组成。
shared MLP:由1x1的卷积实现
其公式如下:
σ表示sigmod函数,与上面不同的是,此处采取MaxPool与AvgPool一同进行压缩。global average pooling对feature map上的每一个像素点都有反馈,而global max pooling在进行梯度反向传播计算只有feature map中响应最大的地方有梯度的反馈,能作为GAP的一个补充。
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
然在,在通道上进行concat
x = torch.cat([avg_out, max_out], dim=1) # 在通道上直接cat得到channel为2的特征图
最后经过7x7的卷积核和sigmod函数得到对应的空间注意力系数。
x = nn.Conv2d(2,1,7,padding=1, bias=False)
x = nn.Sigmod()
return x
在主流程当中,CBAM的通道/空间注意力机制只是计算出对应的系数,还需要和前面特征图进行相乘得到对应的经过注意力机制的特征图。下面展示部分代码段:
self.ca = ChannelAttention(planes)
self.sa = SpatialAttention()
....
....
out = self.ca(out) * out # 通道机制
out = self.sa(out) * out # 空间机制
由于是从自然语言处理那边引申到图像处理方面的,此处就不做介绍,下一章会单独进行详细的介绍。
因篇幅问题不能全部显示,请点此查看更多更全内容