用PyTorch可以实现attention机制的例子
时间: 2023-12-01 22:05:04 浏览: 104
Pytorch 实现注意力机制
当然可以!下面是一个使用PyTorch实现attention机制的示例代码:
```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)
self.query = nn.Linear(hidden_size, hidden_size)
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]
att_weights = torch.matmul(encoder_outputs, self.att_weights) # [batch_size, seq_len, hidden_size]
att_weights = torch.bmm(att_weights, decoder_hidden).squeeze(2) # [batch_size, seq_len]
attention_scores = torch.softmax(att_weights, dim=1) # [batch_size, seq_len]
context_vector = torch.bmm(encoder_outputs.transpose(1, 2), attention_scores.unsqueeze(2)).squeeze(2) # [batch_size, hidden_size]
return context_vector, attention_scores
```
在这个例子中,我们定义了一个Attention类,它接受一个隐藏大小(hidden_size)作为参数。在初始化方法中,我们定义了注意力权重(att_weights)作为模型参数,并且使用正态分布进行初始化。我们还定义了一个用于将decoder隐藏状态转换为query向量的线性层(query)。
在前向传播方法中,我们首先计算注意力权重,通过将encoder输出(encoder_outputs)与注意力权重相乘并累加得到。然后,我们将decoder隐藏状态与注意力权重进行点积,得到每个时间步的注意力得分(attention_scores)。接下来,我们通过对注意力得分进行softmax操作,得到注意力权重的归一化值。最后,我们计算上下文向量(context_vector)作为encoder输出的加权和,其中权重是注意力权重。
这是一个基本的attention机制的实现示例,你可以根据自己的需要进行修改和扩展。希望对你有帮助!
阅读全文