我想获得一个通道与沿空间轴 (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
有没有有效的方法来实现这个?
这称为 外部操作 ,给定单个张量形状
(*, 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]]]]])