【即插即用】CA注意力机制(附源码)

本文介绍了一种新的注意力机制——坐标注意力,它结合了位置信息于通道注意力中,增强模型对空间信息的理解,尤其在ImageNet分类及下游任务中表现优秀。该机制易于集成到MobileNetV2等架构,计算负担小,提升了模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:

https://paperswithcode.com/paper/coordinate-attention-for-efficient-mobile

源码链接:

https://github.com/houqb/CoordAttention

摘要简介:

最近的研究表明,在移动网络设计中,通道注意力对于提升模型性能非常有效。但现有的研究常常忽略了位置信息,这对于生成精确的空间注意力图来说是非常重要的。在本文中,我们提出了一种创新的注意力机制,我们称之为“坐标注意力”。这个机制将位置信息融入通道注意力中,从而提升了模型的感知能力。

与常规通道注意力机制不同,坐标注意力并不是简单地将特征张量转换为一个特征向量。而是将其分解为两个一维的特征编码过程,这两个过程各自沿着不同的空间方向来聚合特征。这样,我们既可以捕捉到一个空间方向上的长距离依赖关系,又能保留另一个方向上的精确位置信息。

然后,我们利用这些信息生成一对能够感知方向和位置的注意力图,它们可以互补地应用到输入特征图上,从而增强对感兴趣对象的表示。这个新的注意力机制不仅简单,而且非常容易集成到现有的移动网络架构中,如MobileNetV2、MobileNeXt和EfficientNet,而不会显著增加计算负担。

通过实验验证,我们发现这种坐标注意力机制不仅在ImageNet分类任务上表现出色,而且在更复杂的下游任务,如目标检测和语义分割上,也展现出了更好的性能。

模型结构:
Pytorch版源码:
#CA CVPR 2021 Coordinate Attentions
#除了通道数还得要宽高信息,比如,16,256,256
import torch
from torch import nn

class CA_Block(nn.Module):
    def __init__(self, channel, h, w, reduction=16):
        super(CA_Block, self).__init__()

        self.h = h
        self.w = w

        self.avg_pool_x = nn.AdaptiveAvgPool2d((h, 1))
        self.avg_pool_y = nn.AdaptiveAvgPool2d((1, w))

        self.conv_1x1 = nn.Conv2d(in_channels=channel, out_channels=channel // reduction, kernel_size=1, stride=1,
                                  bias=False)

        self.relu = nn.ReLU()
        self.bn = nn.BatchNorm2d(channel // reduction)

        self.F_h = nn.Conv2d(in_channels=channel // reduction, out_channels=channel, kernel_size=1, stride=1,
                             bias=False)
        self.F_w = nn.Conv2d(in_channels=channel // reduction, out_channels=channel, kernel_size=1, stride=1,
                             bias=False)

        self.sigmoid_h = nn.Sigmoid()
        self.sigmoid_w = nn.Sigmoid()

    def forward(self, x):
        x_h = self.avg_pool_x(x).permute(0, 1, 3, 2)
        x_w = self.avg_pool_y(x)

        x_cat_conv_relu = self.relu(self.conv_1x1(torch.cat((x_h, x_w), 3)))

        x_cat_conv_split_h, x_cat_conv_split_w = x_cat_conv_relu.split([self.h, self.w], 3)

        s_h = self.sigmoid_h(self.F_h(x_cat_conv_split_h.permute(0, 1, 3, 2)))
        s_w = self.sigmoid_w(self.F_w(x_cat_conv_split_w))

        out = x * s_h.expand_as(x) * s_w.expand_as(x)

        return out

if __name__ == '__main__':
    input = torch.randn(2, 32, 512, 512)
    b, channel, h, w = input.shape
    CA = CA_Block(channel, h, w)
    output = CA(input)
    print(output.shape)

### 实现 CA 注意力机制于 C3Ghost 模型 #### 修改模型架构以支持 CA 注意力机制 为了在 `C3Ghost` 模型中集成 CA 注意力机制,需修改原有网络结构文件。通常情况下,这涉及到编辑定义模型层的 Python 文件。 对于 YOLOv5 的变体如 C3Ghost,可以在构建 Ghost 卷积层之后立即应用 CA 注意力模块。这样做的目的是让经过优化后的轻量级卷积操作的结果进一步受益于注意力机制带来的性能增益[^1]。 ```python from models.common import Conv, Bottleneck, SPP, DWConv, Focus, Concat, Contract, Expand import torch.nn as nn class CoordAtt(nn.Module): def __init__(self, inp, oup, reduction=32): super(CoordAtt, self).__init__() # 定义CA注意力的具体实现... def forward(self, x): # 前向传播逻辑... class C3Ghost_CA(nn.Module): # C3 module with Ghost bottleneck and CA attention mechanism def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self attentions = CoordAtt(c_, c_) self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)]) self.cv3 = Conv(2 * c_, c2, 1) def forward(self, x): y1 = self.attentions(self.m(self.cv1(x))) y2 = self.cv2(x) return self.cv3(torch.cat((y1, y2), dim=1)) ``` 上述代码展示了如何创建一个新的类 `C3Ghost_CA` 来继承自原始的 `nn.Module` 并组合使用了 `CoordAtt` 和现有的瓶颈设计。这里的关键在于将 CA 注意力应用于中间特征映射上,即在网络流经第一个卷积层 (`cv1`) 后以及进入后续残差连接之前[^2]。 #### 调整配置文件 除了更改源码外,还需要更新相应的 YAML 配置文件来反映新的组件设置。确保所使用的预训练权重与新架构兼容或重新初始化参数以便开始新一轮训练。 最后值得注意的是,虽然理论上可以在任何位置插入注意力模块,但在实践中应当考虑其对整体架构的影响,选择合适的地方添加才能最大化收益[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值