注意力机制汇总----(1)

注意力机制汇总----(1)


在介绍什么是注意力机制之前,先让大家看一张图片。当大家看到下面图片,会首先看到什么内容?当过载信息映入眼帘时,我们的大脑会把注意力放在主要的信息上,这就是大脑的注意力机制。

从神经网络层面通俗来讲:注意力机制就是希望网络能够自动学出来图片或者文字序列中的需要注意的地方。比如人眼在看一幅画的时候,不会将注意力平等地分配给画中的所有像素,而是将更多注意力分配给人们关注的地方。

在这里插入图片描述

据本人了解目前注意力机制在**计算机视觉(CV)**上的应用主要集中于一下三种注意力方式:

  • 通道注意力机制(SE-NET
  • 空间注意力机制(CBAM
  • self-Attention

1. SE-Net----通道注意力机制

SE-Block

在这里插入图片描述

上图中,首先经过正常的卷积得到U(C,H,W),然后将得到的特征图经过全局平均池化(nn.AdaptiveAvgPool2d)得到1x1xC的向量,再经过2个全连接层(nn.Linear),重置向量里的值,最后将得到的向量与U相乘

  • **Squeeze:**顺着空间维度进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配
  • **Excitation:**基于特征通道间的相关性,每个特征通道生成一个权重,用来代表特征通道的重要程度
  • **Reweight:**将Excitation输出的权重看做每个特征通道的重要性,然后通过乘法逐通道加权到之前的特征上,完成在通道维度上的对原始特征的重标定

代码实例

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模块得到
  • SE模块也可以嵌入到现在几乎所有的网络结构中
  • 前面层中的SE block以类别无关(class agnostic)的方式增强可共享的低层表示的质量
  • 越后面层中SE block越来越类别相关
  • SE block重新调整特征的益处可以在整个网络中积累

论文中除了介绍SE模块外,还简述了SE-block与 resnet和inception的结合使用,此外,还从各个方面比较se的效果和参数量的变化。

2. CBAM----空间注意力机制

Convolutional Block Attention Module(CBAM):主要网络架构由通道注意力机制空间注意力机制组成。

通道注意力机制

在这里插入图片描述

在这里插入图片描述

shared MLP:由1x1的卷积实现

其公式如下:

在这里插入图片描述

σ表示sigmod函数,与上面SE-Block不同的是,此处采取MaxPoolAvgPool一同进行压缩。global average pooling对feature map上的每一个像素点都有反馈,而global max pooling在进行梯度反向传播计算只有feature map中响应最大的地方有梯度的反馈,能作为GAP的一个补充。

空间注意力机制

在这里插入图片描述
[MaxPool, AvgPool]是对输入特征分别在通道维度上做了mean和max操作

	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  # 空间机制

3. Self-Attention

由于self-Attention是从自然语言处理那边引申到图像处理方面的,此处就不做介绍,下一章会单独进行详细的介绍。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值