web-dev-qa-db-ja.com

軸に沿ったテンソルのトーチ合計

ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)

代わりに列を合計するにはどうすればよいですか?

18
Abhishek Bhatia

最も簡単で最良の解決策は、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]
34
mexmex

あるいは、tensor.sum(axis)を使用できます。ここで、axis0および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 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]])
1
kmario23

テンソル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]])
0
postylem