沿轴的火炬和张量

Torch sum a tensor along an axis

提问人:Abhishek Bhatia 提问时间:6/28/2017 最后编辑:Mateen UlhaqAbhishek Bhatia 更新时间:11/6/2022 访问量:127432

问:

如何对张量的列求和?

torch.Size([10, 100])    --->    torch.Size([10])
python pytorch 总和

评论


答:

92赞 mbpaulus 6/28/2017 #1

最简单和最好的解决方案是使用 .torch.sum()

要对张量的所有元素求和:

torch.sum(x) # gives back a scalar

要对所有行(即每列)求和:

torch.sum(x, dim=0) # size = [ncol]

要对所有列(即每一行)求和:

torch.sum(x, dim=1) # size = [nrow]

应该注意的是,求和的维度是从生成的张量中消除的。

评论

1赞 kkgarg 9/24/2020
关于合成张量维度的一个很好的观察是,无论我们提供哪个微弱的 1,最终张量在该特定轴上都会有 1,而其余轴的尺寸保持不变。这特别有助于我可视化在更高维张量的情况下我们将如何求和。
14赞 kmario23 4/14/2019 #2

或者,对于二维张量,您可以使用 where 分别表示行和列的总和。tensor.sum(axis)axis01

In [210]: X
Out[210]: 
tensor([[  1,  -3,   0,  10],
        [  9,   3,   2,  10],
        [  0,   3, -12,  32]])

In [211]: X.sum(1)
Out[211]: tensor([ 8, 24, 23])

In [212]: X.sum(0)
Out[212]: tensor([ 10,   3, -10,  52])

从上面的输出可以看出,在这两种情况下,输出都是一维张量。另一方面,如果您也希望在输出中保留原始张量的维度,那么您已将布尔值 kwarg 设置为:keepdimTrue

In [217]: X.sum(0, keepdim=True)
Out[217]: tensor([[ 10,   3, -10,  52]])

In [218]: X.sum(1, keepdim=True)
Out[218]: 
tensor([[ 8],
        [24],
        [23]])

评论

3赞 obadul024 5/15/2020
谢谢,这是一个很好的答案。乍一看,这个昏暗的 VAR 似乎非常违反直觉
4赞 postylem 7/15/2019 #3

如果您有 tensor ,并且希望对第二个数组维度(即索引为 1 的数组维度求和,如果张量是 2 维的,则为列维度,就像您的张量一样),请使用或等效地参阅此处的文档my_tensortorch.sum(my_tensor,1)my_tensor.sum(1)

文档中没有明确提到的一件事是:您可以使用(或倒数第二个维度,用 等)对最后一个数组维度求和。-1-2

因此,在您的示例中,您可以使用:或 、 或、等效地或 。所有这些都将给出相同的结果,一个大小为 的输出张量,每个条目都是张量给定列中所有行的总和。outputs.sum(1)torch.sum(outputs,1)outputs.sum(-1)torch.sum(outputs,-1)torch.Size([10])outputs

用三维张量来说明:

In [1]: my_tensor = torch.arange(24).view(2, 3, 4) 
Out[1]: 
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])

In [2]: my_tensor.sum(2)
Out[2]:
tensor([[ 6, 22, 38],
        [54, 70, 86]])

In [3]: my_tensor.sum(-1)
Out[3]:
tensor([[ 6, 22, 38],
        [54, 70, 86]])
2赞 Frank Xu 11/8/2021 #4

基于文档 https://pytorch.org/docs/stable/generated/torch.sum.html

它应该是

dim (int 或 python:ints 的元组) - 要减少的一个或多个维度。

dim=0 表示减少行尺寸:压缩所有行 = 按列求和
dim=1 表示减少列维数:压缩列数= 按行求和

1赞 JVGD 4/26/2022 #5

沿多个轴或尺寸的火炬总和

只是为了完整起见(我不容易找到它),我包括如何对多个维度求和,这在计算机视觉任务中大量使用,您必须减少维度和维度。torch.sumHW

如果您有一个具有形状的图像,并且想要计算每个通道的平均像素强度值,您可以执行以下操作:xC x H x W

avg = torch.sum(x, dim=(1,2)) / (H*W)     # Sum along (H,W) and norm