火炬矩阵等式求和运算
pytorch 211
原文标题 :torch matrix equaity sum operation
我想做一个类似于矩阵乘法的操作,除了我想检查相等性而不是乘法。我想要达到的效果类似于以下:
a = torch.Tensor([[1, 2, 3], [4, 5, 6]]).to(torch.uint8)
b = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]).to(torch.uint8)
result = [[sum(a[i] == b [j]) for j in range(len(b))] for i in range(len(a))]
有没有办法可以使用 einsum 或 pytorch 中的任何其他功能来有效地实现上述目标?
回复
我来回复-
Phoenix 评论
你可以使用torch.repeat和torch.repeat_interleave:
a = torch.Tensor([[1, 2, 3], [4, 5, 6]]) b = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) mask = a.repeat_interleave(3, dim=0) == b.repeat(2,dim=1) torch.sum(mask, axis=1).reshape(a.shape) # output tensor([[3, 0, 0], [0, 3, 0]])
2年前 -
flawr 评论
该回答已被采纳!
您可以使用广播来做同样的事情,例如
result = (a[:, None, :] == b[None, :, :]).sum(dim=2)
这里
None
只是介绍了一个虚拟尺寸 – 或者您可以使用较少的视觉.unsqueeze()
来代替。2年前 -
Kevin 评论
矩阵乘法是
ij,jk->ik
在 einsum 表示法中,所有这些操作都等价于不同的详细程度:a @ b torch.einsum("ij,jk", a, b) torch.einsum("ij,jk->ik", a, b) (a[:,:,None] * b[None,:,:]).sum(1)
“乘
i
和k
维度并减少j
维度”i, j, k i, j, k a: (2, 3) => (2, 3, None) b: (3, 3) (None, 3, 3)
现在应该从这个函数分解中清楚地看出,乘法可以用任何二元运算代替,例如相等运算。
不幸的是,pytorch 中没有通用形式的 einsum (AFAIK) 可以“开箱即用”地交换乘法。然而,有一个
einops
库,它基本上是深度学习框架(如 PyTorch)的包装器。2年前