我正在实现一个基于MemoryNetworks的模型。我有(context, query, answer)
的三元组数据。我想要计算注意力。注意力指示上下文中的哪些句子应该被关注。
为了制定小批量,我使用零填充来创建context
数据。下面是注意力数据。0值表示填充零的上下文的嵌入结果。在这样的数据中,我想将softmax应用于索引0, 1, 2, 3, last
。因此,模型应忽略零填充列。
那么我该如何认识到这一点呢?我想知道当我们使用补零和注意力机制时,这样的技术。虽然我更喜欢pytorch,但任何工具或只是描述答案也将受到感谢。
Before softmax. torch.bmm(contex, q)
109.8601
77.6376
68.3927
199.1673
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
348.0155
[torch.cuda.FloatTensor of size 15 (GPU 0)]
After softmax. F.softmax( torch.bmm(contex, q) )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[torch.cuda.FloatTensor of size 15 (GPU 0)]
发布于 2018-02-05 21:45:54
你可以在pytorch中用另一个张量作为张量的下标。
因此,如果我有:
T = torch.from_numpy(np.arange(10))
大小为10的
0 1 2 3 4 5 6 7 8 9 torch.LongTensor
然后
T[torch.from_numpy(np.array([0, 3, 7]))]
大小为3的
0 3 7 torch.LongTensor
所以在您的例子中,如果您有shape MBxD
的logits
,您可以这样做
idx = torch.from_numpy(np.array([0, 1, 2, 3, logits.size()[1]-1]))
softmax = F.softmax(logits[:, idx])
https://stackoverflow.com/questions/48363823
复制相似问题