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

ParNet注意力机制

ParNet注意力是一种用于自然语言处理任务的注意力机制,它是由谷歌在2019年提出的。ParNet注意力旨在解决传统注意力机制在处理长序列时的效率问题。

传统的注意力机制在计算注意力权重时,需要对所有输入序列的位置进行逐一计算,这导致了在长序列上的计算复杂度较高。而ParNet注意力通过将序列分割成多个子序列,并对每个子序列进行独立的注意力计算,从而降低了计算复杂度。

论文地址:https://arxiv.org/pdf/2110.07641.pdf

结构原理图

代码如下:

import numpy as np
import torch
from torch import nn
from torch.nn import init

class ParNetAttention(nn.Module):

    def __init__(self, channel=512):
        super().__init__()
        self.sse = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channel, channel, kernel_size=1),
            nn.Sigmoid()
        )

        self.conv1x1 = nn.Sequential(
            nn.Conv2d(channel, channel, kernel_size=1),
            nn.BatchNorm2d(channel)
        )
        self.conv3x3 = nn.Sequential(
            nn.Conv2d(channel, channel, kernel_size=3, padding=1),
            nn.BatchNorm2d(channel)
        )
        self.silu = nn.SiLU()

    def forward(self, x):
        b, c, _, _ = x.size()
        x1 = self.conv1x1(x)
        x2 = self.conv3x3(x)
        x3 = self.sse(x) * x
        y = self.silu(x1 + x2 + x3)
        return y

if __name__ == '__main__':
    input = torch.randn(50, 512, 7, 7)
    pna = ParNetAttention(channel=512)
    output = pna(input)
    print(output.shape)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注意力机制深度学习中一种重要的机制,可以在不同的任务中提升模型的性能。下面是一个使用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.attn = nn.Linear(self.hidden_size * 2, self.hidden_size) self.v = nn.Linear(self.hidden_size, 1, bias=False) def forward(self, hidden, encoder_outputs): max_len = encoder_outputs.size(0) batch_size = encoder_outputs.size(1) # 将隐藏状态复制max_len次,变成(batch_size, max_len, hidden_size)的形状 h = hidden.repeat(max_len, 1, 1).transpose(0, 1) # 将encoder_outputs和隐藏状态h拼接起来,得到(batch_size, max_len, hidden_size*2)的形状 encoder_outputs = encoder_outputs.transpose(0, 1) attn_input = torch.cat((h, encoder_outputs), dim=2) # 计算注意力分数,得到(batch_size, max_len, hidden_size)的形状 attn_scores = torch.tanh(self.attn(attn_input)) # 将注意力分数转化为(batch_size, max_len, 1)的形状 attn_weights = self.v(attn_scores).transpose(1,2) # 通过softmax函数,将注意力分数转化为(batch_size, max_len, 1)的概率分布 attn_weights = torch.softmax(attn_weights, dim=-1) # 将encoder_outputs与注意力权重相乘,得到加权后的特征向量 context = torch.bmm(attn_weights, encoder_outputs.transpose(0,1)) # 将加权后的特征向量与隐藏状态拼接起来 output = torch.cat((context, hidden), dim=2) return output, attn_weights ``` 这个代码实现了一个简单的注意力机制,用于将编码器的输出加权后与解码器的隐藏状态拼接起来。具体来说,它的输入是一个隐藏状态和编码器的输出,输出是加权后的特征向量和注意力权重。在forward方法中,它首先将隐藏状态和编码器的输出拼接起来,然后计算注意力分数,并将其转化为概率分布。接着,它将encoder_outputs与注意力权重相乘,得到加权后的特征向量。最后,它将加权后的特征向量与隐藏状态拼接起来,作为输出返回。 注意力机制是一种非常常用的机制,可以用于机器翻译、自然语言处理、语音识别等任务中,能够帮助模型更好地处理长序列输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我悟了-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值