火炬总和沿轴线的张量

问题描述 投票:12回答:2
ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)

如何对列进行求和?

python sum pytorch torch tensor
2个回答
32
投票

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

总结张量的所有元素:

torch.sum(outputs) # gives back a scalar

要汇总所有行(即每列):

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

要汇总所有列(即每行):

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

1
投票

或者,您可以使用tensor.sum(axis),其中axis指示01分别对行和列求和,用于2D张量。

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])

从上面的输出我们可以看出,在两种情况下,输出都是1D张量。另一方面,如果你希望在输出中保留原始张量的维度,那么你将布尔值kwarg keepdim设置为True,如下所示:

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]])

0
投票

如果你有张量my_tensor,并且你希望求和第二个数组维度(即索引为1的那个,即列维度,如果张量是二维的,就像你的那样),使用torch.sum(my_tensor,1)或等效my_tensor.sum(1)看到documentation here

文档中没有明确提到的一件事是:您可以使用-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]])
© www.soinside.com 2019 - 2024. All rights reserved.