Torch 沿轴对张量求和
Torch sum a tensor along an axis
如何对张量的列求和?
torch.Size([10, 100]) ---> torch.Size([10])
最简单和最好的解决方案是使用 torch.sum()
。
对张量的所有元素求和:
torch.sum(x) # gives back a scalar
对所有行求和(即对每一列):
torch.sum(x, dim=0) # size = [1, ncol]
对所有列求和(即每一行):
torch.sum(x, dim=1) # size = [nrow, 1]
或者,您可以使用 tensor.sum(axis)
,其中 axis
表示 0
和 1
分别对二维张量的行和列求和。
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 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]])
如果您有张量 my_tensor
,并且您希望对第二个数组维度(即索引为 1 的维度,即 column-dimension,如果张量为 2-维度,就像你的一样),使用 torch.sum(my_tensor,1)
或等效的 my_tensor.sum(1)
参见 documentation here.
文档中未明确提及的一件事是:您可以使用 -1
(或 second-to 最后一个维度,有 -2
,等等)
因此,在您的示例中,您可以使用:outputs.sum(1)
或 torch.sum(outputs,1)
,或者等效地,outputs.sum(-1)
或 torch.sum(outputs,-1)
。所有这些都会给出相同的结果,即大小为 torch.Size([10])
的输出张量,每个条目都是张量 outputs
.
给定列中所有行的总和
用3维张量来说明:
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]])
基于文档 https://pytorch.org/docs/stable/generated/torch.sum.html
应该是
dim (int or tuple of python:ints) – 要减少的维度。
dim=0 表示减少行维度:压缩所有行 = sum by col
dim=1 表示减少 col 维度:condense cols= sum by row
沿多个轴或维度的手电筒总和
只是为了完整起见(我无法轻易找到它)我包括如何使用 torch.sum
沿多个维度求和,这在计算机视觉任务中大量使用,你必须沿 [=12 减少=] 和 W
个维度。
如果您有一张 x
形状为 C x H x W
的图像,并且想要计算每个通道的平均像素强度值,您可以这样做:
avg = torch.sum(x, dim=(1,2)) / (H*W) # Sum along (H,W) and norm
如何对张量的列求和?
torch.Size([10, 100]) ---> torch.Size([10])
最简单和最好的解决方案是使用 torch.sum()
。
对张量的所有元素求和:
torch.sum(x) # gives back a scalar
对所有行求和(即对每一列):
torch.sum(x, dim=0) # size = [1, ncol]
对所有列求和(即每一行):
torch.sum(x, dim=1) # size = [nrow, 1]
或者,您可以使用 tensor.sum(axis)
,其中 axis
表示 0
和 1
分别对二维张量的行和列求和。
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 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]])
如果您有张量 my_tensor
,并且您希望对第二个数组维度(即索引为 1 的维度,即 column-dimension,如果张量为 2-维度,就像你的一样),使用 torch.sum(my_tensor,1)
或等效的 my_tensor.sum(1)
参见 documentation here.
文档中未明确提及的一件事是:您可以使用 -1
(或 second-to 最后一个维度,有 -2
,等等)
因此,在您的示例中,您可以使用:outputs.sum(1)
或 torch.sum(outputs,1)
,或者等效地,outputs.sum(-1)
或 torch.sum(outputs,-1)
。所有这些都会给出相同的结果,即大小为 torch.Size([10])
的输出张量,每个条目都是张量 outputs
.
用3维张量来说明:
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]])
基于文档 https://pytorch.org/docs/stable/generated/torch.sum.html
应该是
dim (int or tuple of python:ints) – 要减少的维度。
dim=0 表示减少行维度:压缩所有行 = sum by col
dim=1 表示减少 col 维度:condense cols= sum by row
沿多个轴或维度的手电筒总和
只是为了完整起见(我无法轻易找到它)我包括如何使用 torch.sum
沿多个维度求和,这在计算机视觉任务中大量使用,你必须沿 [=12 减少=] 和 W
个维度。
如果您有一张 x
形状为 C x H x W
的图像,并且想要计算每个通道的平均像素强度值,您可以这样做:
avg = torch.sum(x, dim=(1,2)) / (H*W) # Sum along (H,W) and norm