我正在尝试使用PyTorch生成矢量矩阵外积(张量)。假设向量v
的大小为p
,矩阵M
的大小为qXr
,则乘积的结果应为pXqXr。
示例:
#size: 2
v = [0, 1]
#size: 2X3
M = [[0, 1, 2],
[3, 4, 5]]
#size: 2X2X3
v*M = [[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]]
对于两个向量v1
和v2
,我可以使用torch.bmm(v1.view(1, -1, 1), v2.view(1, 1, -1))
。这可以很容易地扩展为一批向量。但是,我找不到向量矩阵案例的解决方案。另外,我需要对一批矢量和矩阵执行此操作。
答案 0 :(得分:3)
您可以使用einsum
torch.einsum('bp, bqr->bpqr', v, M) #batch version (v.shape=(b,p) M.shape=(b,q,r))
torch.einsum('p, qr->pqr', v, M) #non batch version
答案 1 :(得分:0)
我能够使用以下代码来做到这一点。
单个向量和矩阵
v = torch.arange(3)
M = torch.arange(8).view(2, 4)
# v: tensor([0, 1, 2])
# M: tensor([[0, 1, 2, 3],
# [4, 5, 6, 7]])
torch.mm(v.unsqueeze(1), M.view(1, 2*4)).view(3,2,4)
tensor([[[ 0, 0, 0, 0],
[ 0, 0, 0, 0]],
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 0, 2, 4, 6],
[ 8, 10, 12, 14]]])
对于一批向量和矩阵,可以使用torch.bmm
轻松地对其进行扩展。
v = torch.arange(batch_size*2).view(batch_size, 2)
M = torch.arange(batch_size*3*4).view(batch_size, 3, 4)
torch.bmm(v.unsqueeze(2), M.view(-1, 1, 3*4)).view(-1, 2, 3, 4)
答案 2 :(得分:0)
如果[batch_size,z,x,y]是目标矩阵的形状,则另一种解决方案是构建此形状的两个矩阵,并在每个位置具有适当的元素,然后应用逐元素乘法。可以与一批矢量配合使用:
# input matrices
batch_size = 2
x1 = torch.Tensor([0,1])
x2 = torch.Tensor([[0,1,2],
[3,4,5]])
x1 = x1.unsqueeze(0).repeat((batch_size, 1))
x2 = x2.unsqueeze(0).repeat((batch_size, 1, 1))
# dimensions
b = x1.shape[0]
z = x1.shape[1]
x = x2.shape[1]
y = x2.shape[2]
# solution
mat1 = x1.reshape(b, z, 1, 1).repeat(1, 1, x, y)
mat2 = x2.reshape(b,1,x,y).repeat(1, z, 1, 1)
mat1*mat2