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

本文介绍了一种新的全局注意力机制,通过在通道和空间维度上增强信息保留与交互,改进深度神经网络在图像分类任务中的性能。实验表明,无论ResNet还是MobileNet,该方法在CIFAR-100和ImageNet-1K数据集上均优于其他注意力机制。

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

论文地址:https://arxiv.org/abs/2112.05561#/
摘要:

为了提升各种计算机视觉任务的性能,已经研究了多种注意力机制。然而,先前的方法忽视了在通道和空间两个层面保留信息的重要性,从而影响了跨维度的交互。因此,我们提出了一种全局注意力机制,它通过减少信息损失并放大全局交互表示,来提升深度神经网络的性能。我们为通道注意力引入了3D置换和多层感知器,并设计了一个卷积空间注意力子模块。在CIFAR-100和ImageNet-1K图像分类任务上评估我们提出的机制时,结果显示,无论是使用ResNet还是轻量级的MobileNet,我们的方法都稳定地优于最近的几种注意力机制。

简而言之,我们设计了一种新的全局注意力机制,它能更好地保留和处理图像在通道和空间两个维度的信息,进而提升深度神经网络在图像分类任务上的性能。在多个数据集和模型上的测试都显示,我们的方法比其他注意力机制更为出色。

结构图:

Pytorch源码:
import torch.nn as nn
import torch


class GAM_Attention(nn.Module):
    def __init__(self, in_channels, out_channels, rate=4):
        super(GAM_Attention, self).__init__()

        self.channel_attention = nn.Sequential(
            nn.Linear(in_channels, int(in_channels / rate)),
            nn.ReLU(inplace=True),
            nn.Linear(int(in_channels / rate), in_channels)
        )

        self.spatial_attention = nn.Sequential(
            nn.Conv2d(in_channels, int(in_channels / rate), kernel_size=7, padding=3),
            nn.BatchNorm2d(int(in_channels / rate)),
            nn.ReLU(inplace=True),
            nn.Conv2d(int(in_channels / rate), out_channels, kernel_size=7, padding=3),
            nn.BatchNorm2d(out_channels)
        )

    def forward(self, x):
        b, c, h, w = x.shape
        x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
        x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)
        x_channel_att = x_att_permute.permute(0, 3, 1, 2)

        x = x * x_channel_att

        x_spatial_att = self.spatial_attention(x).sigmoid()
        out = x * x_spatial_att

        return out


if __name__ == '__main__':
    x = torch.randn(1, 64, 32, 32)
    b, c, h, w = x.shape
    net = GAM_Attention(in_channels=c, out_channels=c)
    y = net(x)
    print(y.shape)

当涉及到注意力机制代码实现时,可以使用 PyTorch 框架来实现。以下是一个简单的示例代码: ```python import torch import torch.nn as nn class Attention(nn.Module): def __init__(self, hidden_size): super(Attention, self).__init__() self.hidden_size = hidden_size self.att_weights = nn.Parameter(torch.Tensor(hidden_size, hidden_size)) self.att_weights.data.normal_(mean=0.0, std=0.05) def forward(self, encoder_outputs, decoder_hidden): # encoder_outputs: [batch_size, seq_len, hidden_size] # decoder_hidden: [batch_size, hidden_size] seq_len = encoder_outputs.size(1) decoder_hidden = decoder_hidden.unsqueeze(2) # [batch_size, hidden_size, 1] # 计算注意力权重 weights = torch.bmm(encoder_outputs, torch.matmul(decoder_hidden, self.att_weights).squeeze(2).unsqueeze(2)) weights = torch.softmax(weights.squeeze(2), dim=1) # 加权平均计算上下文向量 context_vector = torch.bmm(encoder_outputs.transpose(1, 2), weights.unsqueeze(2)).squeeze(2) return context_vector, weights ``` 在这个例子中,`Attention` 类实现了一个简单的注意力模块。它接受编码器的输出 `encoder_outputs`(形状为 `[batch_size, seq_len, hidden_size]`)和解码器的隐藏状态 `decoder_hidden`(形状为 `[batch_size, hidden_size]`),并返回注意力加权后的上下文向量 `context_vector` 和注意力权重 `weights`。 注意力权重的计算使用了矩阵乘法和 softmax 函数,以及一些维度调整操作。最后,通过加权平均计算上下文向量。 请注意,这只是一个简单的示例代码,具体实现可能因应用场景的不同而有所变化。如果你有特定的应用需求,可以进一步调整和优化该代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值