张量沿空间轴彼此的元素差异(Pytorch)

问题描述 投票:0回答:1

我想获得一个通道与沿空间轴 (1, 2) 的所有其他通道的差异。 c_deltas 和 c_in 的长度应该相等。

in_shape = [bs, y_dim, x_dim, c_in]
out_shape = [bs, y_dim, x_dim, c_in, c_deltas]

以下是一些具有预期结果的示例(1d 和 4d):

# 1d example; in.size=(4), out.size=(4, 4)
in_matrix = [1, 3, 4, 7]
out_matrix = [[0, 2, 3, 6], [-2, 0, 1, 4], [-3, -1, 0, 3], [-6, -4, -1, 0]]

# 4d example; in.size=(1, 2, 2, 3), out.size=(1, 2, 2, 3, 3)
in_matrix=[[[[6,5,1], [2, 5, 3]], [[1, 4, 8], [8, 6, 4]]]]
out_matrix =  [[[[[0, -1, -5], [1, 0, -4], [5, 4, 0]],
                 [[0, 3, 1], [-3, 0, -2], [-1, 2, 0]]],
                [[[0, 3, 7], [-3, 0, 4], [-7, -4, 0]],
                 [[0, -2, -4], [2, 0, -2], [4, 2, 0]]]]]

我能够找到一些类似的问题;但是,我无法清晰地概括它们以供我使用,例如 https://discuss.pytorch.org/t/compute-difference-of-each-element-in-a-tensor-with-each-other/44087 /2

有没有有效的方法来实现这个?

python pytorch tensor
1个回答
0
投票

这称为 外部操作 ,给定单个张量形状

(*, i)
,您希望跨元素计算操作,从而产生张量形状
(*,i,i)
。您可以通过深思熟虑地解压缩初始张量上的额外维度来实现这一点。

在第一个示例中,如果您编写 x1 和 x2,使其形状分别为

(i,)
和 (
(i,1)
),则形状为
1,i)
。然后应用逐元素运算符(例如
__sub__
__add__
等...)将执行外部操作,结果将被整形
(i,i)

您的情况:

>>> x = torch.tensor([1, 3, 4, 7])
>>> x[None]-x[:,None]
tensor([[ 0,  2,  3,  6],
        [-2,  0,  1,  4],
        [-3, -1,  0,  3],
        [-6, -4, -3,  0]])

您始终需要在感兴趣的维度周围松开,即。在最后一个和前后维度上。所以在 4D 情况下:

>>> x = torch.tensor([[[[6,5,1], [2, 5, 3]], [[1, 4, 8], [8, 6, 4]]]])
>>> x[...,None,:]-x[...,None]
tensor([[[[[ 0, -1, -5],
           [ 1,  0, -4],
           [ 5,  4,  0]],

          [[ 0,  3,  1],
           [-3,  0, -2],
           [-1,  2,  0]]],


         [[[ 0,  3,  7],
           [-3,  0,  4],
           [-7, -4,  0]],

          [[ 0, -2, -4],
           [ 2,  0, -2],
           [ 4,  2,  0]]]]])
© www.soinside.com 2019 - 2024. All rights reserved.