火炬矩阵等式求和运算

青葱年少 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 中的任何其他功能来有效地实现上述目标?

原文链接:https://stackoverflow.com//questions/71586860/torch-matrix-equaity-sum-operation

回复

我来回复
  • Phoenix的头像
    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年前 0条评论
  • flawr的头像
    flawr 评论

    您可以使用广播来做同样的事情,例如

    result = (a[:, None, :] == b[None, :, :]).sum(dim=2)
    

    这里None只是介绍了一个虚拟尺寸 – 或者您可以使用较少的视觉.unsqueeze()来代替。

    2年前 0条评论
  • Kevin的头像
    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)
    

    “乘ik维度并减少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年前 0条评论