注意力机制(Attention Mechanism)-CBAM

引言

神经网络中的注意力机制(Attention Mechanism)是在计算能力有限的情况下,将计算资源分配给更重要的任务,同时解决信息超载问题的一种资源分配方案。在神经网络学习中,一般而言模型的参数越多则模型的表达能力越强,模型所存储的信息量也越大,但这会带来信息过载的问题。那么通过引入注意力机制,在众多的输入信息中聚焦于对当前任务更为关键的信息,降低对其他信息的关注度,甚至过滤掉无关信息,就可以解决信息过载问题,并提高任务处理的效率和准确性。 

这就类似于人类的视觉注意力机制,通过扫描全局图像,获取需要重点关注的目标区域,而后对这一区域投入更多的注意力资源,获取更多与目标有关的细节信息,而忽视其他无关信息。通过这种机制可以利用有限的注意力资源从大量信息中快速筛选出高价值的信息。


 注意力机制的核心:使网络关注到更为重要的信息 

注意力机制能使卷积神经网络自适应的注意更为重要的信息,因此注意力机制是实现网络自适应注意的重要方式


一般而言,注意力机制可以分为:通道注意力机制、空间注意力机制、二者的结合

空间注意力机制(关注每个通道的比重):

通道注意力机制(关注每个像素点的比重):SENet

二者的结合:CBAM


CBAM(二者的结合)

CBAM:Convolutional Block Attention Module,论文地址

CBAM实现示意图如下所示

 CBAM的核心:应用了 Channel Attention Module(通道注意模块)和Spatial Attention Module(空间注意模块)的结合,对输入进来的特征层分别进行通道注意力模块和空间注意力模块的处理。

Progress

总流程(概括):

输入特征图 \textrm{F}\textrm{F} \in \textrm{R}^{C\times H\times W} 。利用通道注意力模块生成一维通道注意图 \textrm{M}_{\textrm{c}}\textrm{M}_{\textrm{c}}\in  \textrm{R}^{C\times 1\times 1},利用空间注意力模块生成二维空间注意图 \textrm{M}_{\textrm{s}}\textrm{M}_{\textrm{s}}\in \textrm{R}^{1\times H\times W}

1.Channel Attention Module 输入图像的“什么”是有意义的?

上图即为通道注意力模块,对输入进来的特征层分别进行全局平均池化(AvgPool)和全局最大池化(MaxPool)(两个池化都针对于输入特征层的高宽),再将平均池化和最大池化的结果利用共享的全连接层(Shared MLP)进行处理,然后将共享的全连接层所得到的结果进行相加再使用Sigmoid激活函数,进而获得通道注意图即获得输入特征层每一个通道的权重(0~1之间)。最后,将权重通过乘法逐通道加权到输入特征层上即可。

由于Feature Map的每个channel都提取某种级别的特征信息,因此Channel Attention Module的注意力集中在图像中什么级别的特征信息是更重要的。为了有效地计算通道注意力,Channel Attention Module采用了压缩输入特征映射的空间维度方法,相较于使用单一池化的方法Channel Attention Module使用AvgPool(平均池化)和MaxPool(最大池化)的方法并证明双池化的方法具有更强的表征力。具体计算过程如下所示,式中 \sigma 表示Sigmoid函数,\textrm{W}_{0}\in \textrm{R}^{C\times C/r}\textrm{W}_{1}\in \textrm{R}^{C\times C/r}。MLP的权重由 \textrm{W}_{0} 和 \textrm{W}_{1} 共享。\textrm{W}_{0} 前有ReLU激活函数。

 

2.Spatial Attention Module 输入图像的信息部分“在哪里”?

利用特征间的空间关系生成空间注意图

与通道注意模块不同的是,空间注意模块关注的是输入图像的哪部分信息是更重要的,是通道注意模块的补充。为了计算空间注意力,首先沿着每一个特征点的通道方向应用平均池化和最大池化(两个池化都针对于输入特征层的通道)并将其堆叠起来生成一个有效的特征描述符使用两个池化聚合一个Feature Map的通道信息,生成两个2D Map:\textrm{F}^{s}_{avg}\in \textrm{R}^{1\times H\times W} 和 \textrm{F}^{s}_{max}\in \textrm{R}^{1\times H\times W},分别为通道的平均池化特性和最大池化特性),再利用一个标准的卷积层(通道数为1的卷积)进行连接和卷积(调整了通道数),然后使用Sigmoid激活函数,进而得到二维空间注意力图即获得输入特征图每个特征点的权重值(0~1间),最后,将权重通过乘法逐通道加权到输入特征层上即可,具体计算过程如下所示,式中  \sigma 表示Sigmoid函数,f^{7\times 7}表示7×7大小的卷积核。

 代码实现

import torch
import torch.nn as nn

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=8):
        """
        第一层全连接层神经元个数较少,因此需要一个比例系数ratio进行缩放
        """
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        """
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // ratio, False),
            nn.ReLU(),
            nn.Linear(channel // ratio, channel, False)
        )
        """
        # 利用1x1卷积代替全连接
        self.fc1   = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        return self.sigmoid(out)

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)

class cbam_block(nn.Module):
    def __init__(self, channel, ratio=8, kernel_size=7):
        super(cbam_block, self).__init__()
        self.channelattention = ChannelAttention(channel, ratio=ratio)
        self.spatialattention = SpatialAttention(kernel_size=kernel_size)

    def forward(self, x):
        x = x * self.channelattention(x)
        x = x * self.spatialattention(x)
        return x

  • 21
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Conda CBAM是一种神经网络模型中的注意力机制,用于提升模型对图像特征的关注度。CBAM全称是“Convolutional Block Attention Module”,即卷积块注意力模块。它由两个主要部分组成:通道注意力和空间注意力。 通道注意力通过学习自适应地调整不同通道的权重来提取图像中最重要的特征。通常来说,一些通道对于分类或者定位任务更加重要,而其他通道可能含有噪声或无用信息。通过使用CBAM的通道注意力机制,模型可以自动选择关键通道,并加强其对这些通道的关注。 空间注意力则在图像不同区域之间进行空间上的关注度分配。不同区域的图像特征对于不同任务的影响程度不同,而空间注意力可以通过调整不同区域的权重来提升模型的性能。它可以帮助模型有针对性地关注到重要的局部区域,提高分类、定位等任务的准确性。 在使用Conda CBAM时,我们可以将它添加到我们的卷积神经网络中。它通过分别引入通道注意力和空间注意力模块,来增强我们模型对重要特征的学习能力。通过使用CBAM,我们可以提高模型的性能,使其在图像分类、对象定位和目标检测等任务中更加精确和可靠。 总而言之,Conda CBAM是一种注重注意力机制的神经网络模型,它通过通道注意力和空间注意力来提升模型对图像特征的关注度,从而提高模型的性能和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值