ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)
Comment puis-je faire la somme sur les colonnes à la place?
La solution la plus simple et la meilleure consiste à utiliser torch.sum()
.
Pour résumer tous les éléments d'un tenseur:
torch.sum(outputs) # gives back a scalar
Pour additionner toutes les lignes (c'est-à-dire pour chaque colonne):
torch.sum(outputs, dim=0) # size = [1, ncol]
Pour additionner toutes les colonnes (c'est-à-dire pour chaque ligne):
torch.sum(outputs, dim=1) # size = [nrow, 1]
Vous pouvez également utiliser tensor.sum(axis)
où axis
indique 0
et 1
pour la somme des rangées et des colonnes, respectivement, pour un tenseur 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])
Comme on peut le voir à partir des sorties ci-dessus, dans les deux cas, la sortie est un tenseur 1D. Par contre, si vous souhaitez conserver la dimension du tenseur d'origine dans la sortie également, vous avez défini le kwarg booléen keepdim
sur True
comme dans:
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]])
Si vous avez le tenseur my_tensor
Et que vous souhaitez additionner sur la deuxième dimension du tableau (c'est-à-dire celle avec l'indice 1, qui est la dimension de la colonne, si le tenseur est à 2 dimensions, comme le vôtre) , utilisez torch.sum(my_tensor,1)
ou de manière équivalente my_tensor.sum(1)
voir documentation ici .
Une chose qui n’est pas explicitement mentionnée dans la documentation est la suivante: vous pouvez additionner la dernière dimension de tableau en utilisant -1
(Ou avant-dernière dimension, avec -2
, etc.)
Ainsi, dans votre exemple, vous pourriez utiliser: outputs.sum(1)
ou torch.sum(outputs,1)
, ou, de manière équivalente, outputs.sum(-1)
ou torch.sum(outputs,-1)
. Tous ces éléments donneraient le même résultat, un tenseur de sortie de taille torch.Size([10])
, chaque entrée correspondant à la somme de toutes les lignes d'une colonne donnée du tenseur outputs
.
Pour illustrer avec un tenseur à 3 dimensions:
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]])