ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)
代わりに列を合計するにはどうすればよいですか?
最も簡単で最良の解決策は、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]
あるいは、tensor.sum(axis)
を使用できます。ここで、axis
は0
および1
を示し、それぞれ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]])
テンソルmy_tensor
があり、2番目の配列次元(つまり、テンソルが2次元の場合、インデックス1が列次元であるもの)で合計したい場合、 torch.sum(my_tensor,1)
または同等のmy_tensor.sum(1)
を使用してください ドキュメントはこちら を参照してください。
ドキュメントで明示的に言及されていないことの1つは、-1
を使用してlast配列次元を合計することができます(または2番目の--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]])