pytorch代码实现注意力机制之EMA

EMA注意力机制

EMA注意力机制,基于跨空间学习的高效多尺度注意力模块,ICASSP2023推出,效果优于ECA、CBAM、CA ,小目标涨点明显。
论文地址:Efficient Multi-Scale Attention Module with Cross-Spatial Learning
EMA结构原理图
结构对比

在各种计算机视觉任务中,通道或空间注意力机制在产生更清晰的特征表示方面的显著有效性得到了证明。然而,通过通道降维来建模跨通道关系可能会给提取深度视觉表示带来副作用。提出了一种新的高效的多尺度注意力(EMA)模块。以保留每个通道上的信息和降低计算开销为目标,将部分通道重塑为批量维度,并将通道维度分组为多个子特征,使空间语义特征在每个特征组中均匀分布。具体来说,除了对全局信息进行编码以重新校准每个并行分支中的通道权重外,还通过跨维度交互进一步聚合两个并行分支的输出特征,以捕获像素级成对关系。对图像分类和目标检测任务进行了广泛的消融研究和实验,使用流行的基准(如CIFAR-100、ImageNet-1k、MS COCO和VisDrone2019)来评估其性能。

代码实现:

import torch
from torch import nn

class EMA(nn.Module):
    def __init__(self, channels, factor=8):
        super(EMA, self).__init__()
        self.groups = factor
        assert channels // self.groups > 0
        self.softmax = nn.Softmax(-1)
        self.agp = nn.AdaptiveAvgPool2d((1, 1))
        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
        self.pool_w = nn.AdaptiveAvgPool2d((1, None))
        self.gn = nn.GroupNorm(channels // self.groups, channels // self.groups)
        self.conv1x1 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=1, stride=1, padding=0)
        self.conv3x3 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=3, stride=1, padding=1)

    def forward(self, x):
        b, c, h, w = x.size()
        group_x = x.reshape(b * self.groups, -1, h, w)  # b*g,c//g,h,w
        x_h = self.pool_h(group_x)
        x_w = self.pool_w(group_x).permute(0, 1, 3, 2)
        hw = self.conv1x1(torch.cat([x_h, x_w], dim=2))
        x_h, x_w = torch.split(hw, [h, w], dim=2)
        x1 = self.gn(group_x * x_h.sigmoid() * x_w.permute(0, 1, 3, 2).sigmoid())
        x2 = self.conv3x3(group_x)
        x11 = self.softmax(self.agp(x1).reshape(b * self.groups, -1, 1).permute(0, 2, 1))
        x12 = x2.reshape(b * self.groups, c // self.groups, -1)  # b*g, c//g, hw
        x21 = self.softmax(self.agp(x2).reshape(b * self.groups, -1, 1).permute(0, 2, 1))
        x22 = x1.reshape(b * self.groups, c // self.groups, -1)  # b*g, c//g, hw
        weights = (torch.matmul(x11, x12) + torch.matmul(x21, x22)).reshape(b * self.groups, 1, h, w)
        return (group_x * weights.sigmoid()).reshape(b, c, h, w)
你可以在GitHub上找到EMA注意力机制代码。具体代码链接是:GitHub - XiaLiPKU/EMANet: The code for Expectation-Maximization Attention Networks for Semantic Segmentation (ICCV'2019 Oral)。该代码实现EMA注意力机制,并在语义分割任务上进行了广泛的实验,包括PASCAL VOC、PASCAL Context和COCO等常用的语义分割数据集。这个代码库提供了对注意力机制进行紧凑估计的实现,并通过加权求和得到低秩的表示,同时消除输入中的噪声信息。通过引入期望最大化注意(EMA)模块,该代码还具有鲁棒性,并且在内存和计算方面也很友好。因此,你可以在这个代码库中找到实现EMA注意力机制代码和相关实验结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [rcnn系列算法改进【NO.71】注意力机制Expectation-Maximization AttentionEMA模块)](https://blog.csdn.net/m0_70388905/article/details/131361576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [期望最大化注意力网络EMANet :Expectation-Maximization Attention Networks for Semantic Segmentation](https://blog.csdn.net/woshidakeai/article/details/102822177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的激励是我肝下去的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值