web-dev-qa-db-fra.com

Torche somme un tenseur le long d'un axe

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?

18
Abhishek Bhatia

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]
34
mexmex

Vous pouvez également utiliser tensor.sum(axis)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]])
1
kmario23

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]])
0
postylem