pytorch的sum怎么那么烦人呢?我怎么知道应该给哪个维度做加和呢。
如果 x=
tensor([[0.5946, 0.3530, 0.2231],
[0.7467, 0.2139, 0.4841],
[0.6990, 0.6151, 0.1369],
[0.1062, 0.5951, 0.7555],
[0.7811, 0.2932, 0.2963]])
那么我想 x.sum(dim=1),第0个维度是行,第1个维度应该是列,那应该是按列求和吧,最后结果应该是一行3列。结果是
tensor([1.1707, 1.4448, 1.4510, 1.4568, 1.3706]) 这分明是按行求和的嘛。
看看官方的说明文档吧。
torch.sum
在给定维度的情况下,返回每一行的和。
如果keepdim=True,那么输出和输出的形状是相同的,除了dim维度变为1。
如果keepdim=False,那么dim的维度就被压缩了(squeezed),那么输出的形状就比输入的形状少了一个维度。
哦,原来不要考虑应该按哪个维度求和,只需要考虑一下求和后的结果是什么形状的。
x是5行3列的。如果我想对每一行求和,那输出的结果应该是5行1列。因为要5行1列,形状还是2个维度,所以keepdim=True。否则就只有一个维度了。因为是第1个维度变为1了,所以应该 dim=1。合并起来就是x.sum(dim=1,keepdim=True)。
如果我想对每一列求和,那输出的结果应该是1行3列。因为要1行3列,形状还是2个维度,所以keepdim=True。因为是第0个维度变为1了,所以dim=0。合并起来就是x.sum(dim=0,keepdim=True)。
当然dim还可以是一个list,那么会依次对这些维度求和。
给一段jupyter notebook中可以跑的代码,可以看看输出的形状。
import torch
x = torch.rand(5,3)
x
y = x.sum(dim=1, keepdim=True)
y
y = x.sum(dim=1)
y
y = x.sum(dim=0, keepdim=True)
y
y = x.sum(dim=0)
y
y = x.sum(dim=[0,1])
y