我正在尝试根据自己的任务调整 seq2seq 模型,https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb
我在解码阶段有两个张量
rnn_output: (1, 1, 256) # time_step x batch_size x hidden_dimension
encoder_inputs: (10, 1, 256) # seq_len x batch_size x hidden_dimension
它们应该相乘以获得形状的注意力分数(在 softmax 之前)
attn_score: (10, 1, 1)
最好的方法是什么? notebook好像用了for循环,有没有更好的矩阵乘法之类的操作?
最佳答案
没有使用 pytorch
的经验,但是这样的东西可以工作吗?
torch.einsum('ijk,abk->abc', (rnn_output, encoder_inputs))
它对最后一个轴进行点积,并向后添加几个空轴。
类似的东西可以用纯 numpy 实现(pytorch 0.4
还没有 ...
符号)
np.einsum('...ik,...jk', rnn_output.numpy(), encoder_inputs.numpy())
或者用np.tensordot
np.tensordot(rnn_output.numpy(), encoder_inputs.numpy(), axes=[2,2])
但是在这里你会得到输出形状:(1, 1, 10, 1)
您可以通过挤压和重新展开来解决这个问题(几乎可以肯定必须有一些更清洁的方法来做到这一点)
np.tensordot(rnn_output.numpy(), encoder_inputs.numpy(), axes=[2,2]).squeeze()[..., None, None]
关于python - 在 PyTorch 和 Numpy 中快速生成形状为 (1, 1, 256) 和 (10, 1, 256) 的多个 3D 张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50570697/