Attention

一、在图像处理中,注意力机制分为空间、通道注意力。

  • 空间注意力机制:绝对于一个层\(H*W\)而言,关注其中重要(权重高)的特色点
  • 通道注意力机制:能够将\( C*H*W \)通过均匀池化将\(H*W\)稀释为1*1,最终造成\(1*1*C\)线性特征向量,进而关注其中重要的通道(权重高)

二、罕用的注意力机制模块

  • SENet模块
    1.介绍:这里是独自应用通道注意力机制。2017年提出的SENet是最初一届ImageNet比赛的冠军,其实现示意图如下所示。对于SENet模块,其重点是取得输出进来的特色层的每一个通道C的权值。利用SENet,咱们能够让网络关注它最须要关注的通道。
    2.代码实现(pytorch)

    import torchfrom torch import nnclass senet(nn.Module):  def __init__(self, channel, ratio=16):      super(senet, self).__init__()      self.avg_pool = nn.AdaptiveAvgPool2d(1) # 全局均匀池化操作,将H*W降维为1*1      self.fc = nn.Sequential( # 两个线性层          nn.Linear(channel, channel // ratio, False),          nn.ReLU(),          nn.Linear(channel // ratio, channel, False),          nn.Sigmoid(),      )  def forward(self, x):      b, c, h, w = x.size()      # b, c, h, w -> b, c, 1, 1 -> b, c      avg = self.avg_pool(x).view(b, c)      # b, c -> b, c //ratio -> b, c -> b, c, 1, 1      fc = self.fc(avg).view(b, c, 1, 1)      print(fc)      # 留神,这里的张量相乘是必须要两个张量的维度是对应雷同才行,不同局部只能是1。      # 例如此处的是:2*512*26*26和2*512*1*1张量之间的乘积      # torch.Size([4, 4, 2])能够和torch.Size([4, 1, 1])乘积      return x * fcmodel = senet(512)print(model)inputs = torch.ones([2, 512, 26, 26])outputs = model(inputs)# print(outputs)
  • CBAM模块
    1.概要介绍:这里是将通道注意力机制和空间注意力机制联合应用。成果比SENet好,其实现示意图如下所示。
    2.具体介绍:将通道注意力机制和空间注意力机制别离开展。
    通道注意力机制:示意图如下,首先将输出的特色图\(C*H*W\)别离对每个通道的\(H*W\)进行最大池化和均匀池化解决,生成一维张量\(C*1*1\);之后别离通过线性层Shared MLP(和SENet一样,第一层对C降维,第二层复原成输出时的C维);最初将通过线性层的两者相加并通过\(Sigmoid\)函数失去通道注意力输入后果\(M_c\)。
    空间注意力机制:示意图如下,首先对通过通道注意力机制优化后的特色图进行通道的均匀池化和最大值池化操作,让通道转化为1,行将\(C*H*W\)转化为\(1*H*W\);之后将最大池化和均匀池化的后果进行重叠,失去\(2*H*W\);最初利用通道数为1的卷积层调整通道数为1(H和W不变)并取\(Sigmoid\)函数失去每个特色点的权重,失去空间注意力机制输入后果\(M_s\)
    3.代码实现(pytorch)