import math import torch from torch import nn from d2l import torch as d2l num_hiddens, num_heads = 100, 5 attention = d2l.MultiHeadAttention(num_hiddens, num_hiddens, num_hiddens, num_hiddens, num_heads, 0.5) attention.eval() MultiHeadAttention( (attention): DotProductAttention( (dropout): Dropout(p=0.5, inplace=False) ) (W_q): Linear(in_features=100, out_features=100, bias=False) (W_k): Linear(in_features=100, out_features=100, bias=False) (W_v): Linear(in_features=100, out_features=100, bias=False) (W_o): Linear(in_features=100, out_features=100, bias=False) ) batch_size, num_queries, valid_lens = 2, 4, torch.tensor([3, 2]) X = torch.ones((batch_size, num_queries, num_hiddens)) attention(X, X, X, valid_lens).shape torch.Size([2, 4, 100])
时间: 2024-04-14 20:32:04 浏览: 101
nystrom-attention:Nyströmformer论文中的Nyström自我注意的实现
这段代码演示了使用之前定义的多头注意力机制 `MultiHeadAttention` 进行前向传播计算的例子。
首先,定义了隐藏层大小 `num_hiddens` 和头数 `num_heads`。然后,创建了一个 `MultiHeadAttention` 实例 `attention`,并传入相应的参数来初始化。
接下来,调用 `eval()` 方法将模型设为评估模式。然后,创建了一个输入张量 `X`,形状为 `(batch_size, num_queries, num_hiddens)`,其中 `batch_size` 表示批量大小,`num_queries` 表示查询序列的长度,`num_hiddens` 表示隐藏层大小。这里使用了全1的张量作为示例输入。
接着,调用 `attention` 实例进行前向传播计算,并传入输入张量 `X`、自身作为查询、自身作为键和值、以及有效长度 `valid_lens`。最后,输出了计算结果的形状,即 `(batch_size, num_queries, num_hiddens)`。
可以看到,输出的形状与输入形状相同,说明多头注意力机制成功地对输入序列进行了处理,并得到了相应的输出。
阅读全文