如何使用 pytorch/numpy 向量化矩阵向量乘法列表
How to vectorise a list of matrix vector multiplications using pytorch/numpy
例如,我有一个 N
B x H
张量列表(即 N x B x H
张量)和一个 N
向量列表(即 N x B
张量)。我想将列表中的每个 B x H
张量与相应的 B
维张量相乘,得到一个 N x H
张量。
我知道如何使用单个for-loop
和PyTorch 来实现计算,但是有没有矢量化植入? (即没有 for-loop
,仅使用 PyTorch/numpy 操作)
您可以通过 torch.bmm()
and some torch.squeeze()
/torch.unsqueeze()
实现。
我个人比较喜欢更通用的torch.einsum()
(我觉得它更具可读性):
import torch
import numpy as np
A = torch.from_numpy(np.array([[[1, 10, 100], [2, 20, 200], [3, 30, 300]],
[[4, 40, 400], [5, 50, 500], [6, 60, 600]]]))
B = torch.from_numpy(np.array([[ 1, 2, 3],
[-1, -2, -3]]))
AB = torch.einsum("nbh,nb->nh", (A, B))
print(AB)
# tensor([[ 14, 140, 1400],
# [ -32, -320, -3200]])
例如,我有一个 N
B x H
张量列表(即 N x B x H
张量)和一个 N
向量列表(即 N x B
张量)。我想将列表中的每个 B x H
张量与相应的 B
维张量相乘,得到一个 N x H
张量。
我知道如何使用单个for-loop
和PyTorch 来实现计算,但是有没有矢量化植入? (即没有 for-loop
,仅使用 PyTorch/numpy 操作)
您可以通过 torch.bmm()
and some torch.squeeze()
/torch.unsqueeze()
实现。
我个人比较喜欢更通用的torch.einsum()
(我觉得它更具可读性):
import torch
import numpy as np
A = torch.from_numpy(np.array([[[1, 10, 100], [2, 20, 200], [3, 30, 300]],
[[4, 40, 400], [5, 50, 500], [6, 60, 600]]]))
B = torch.from_numpy(np.array([[ 1, 2, 3],
[-1, -2, -3]]))
AB = torch.einsum("nbh,nb->nh", (A, B))
print(AB)
# tensor([[ 14, 140, 1400],
# [ -32, -320, -3200]])