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

Jak zamiast tego podsumowuję nad kolumnami?

42
Abhishek Bhatia 28 czerwiec 2017, 01:02

3 odpowiedzi

Najlepsza odpowiedź

Najprostszym i najlepszym rozwiązaniem jest użycie torch.sum().

Sumować wszystkie elementy Tensora:

torch.sum(outputs) # gives back a scalar

Sumować wszystkie wiersze (tj. Dla każdej kolumny):

torch.sum(outputs, dim=0) # size = [1, ncol]

Sumować wszystkie kolumny (tj. Dla każdego wiersza):

torch.sum(outputs, dim=1) # size = [nrow, 1]
74
mbpaulus 28 czerwiec 2017, 15:05

Jeśli masz tensor my_tensor i chcesz sumować w drugim wymiarze tablicy (to znaczy, ten z indeksem 1, który jest wymiarem kolumny, jeśli tensor jest 2-wymiarowy, jak twój jest), Użyj torch.sum(my_tensor,1) lub równoważnie my_tensor.sum(1) patrz Dokumentacja tutaj .

Jedną z rzeczy, które nie są wyraźnie wymienione w dokumentacji, jest: Można sumować wymiar tablicy , używając -1 (lub drugiego do ostatniego wymiaru, z -2 itp.)

Tak więc, w twoim przykładzie można użyć: outputs.sum(1) lub torch.sum(outputs,1), lub, równoważnie, outputs.sum(-1) lub torch.sum(outputs,-1). Wszystkie te dałoby ten sam wynik, wyjście sylwora rozmiaru torch.Size([10]), przy czym każdy wpis jest sumą nad wszystkimi wierszami w danej kolumnie Tensora outputs.

Aby zilustrować z 3-wymiarowym Tensorem:

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]])
1
postylem 15 lipiec 2019, 13:36

Alternatywnie, możesz użyć tensor.sum(axis) gdzie axis wskazuje 0 i 1 i 1, odpowiednio do podsumowania rzędów i kolumn, dla dworca 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])

Ponieważ możemy zobaczyć z powyższych wyjść, w obu przypadkach wyjście jest 3D Tensor. Jeśli z drugiej strony chce zachować wymiar oryginalnego Tensora w wyjściu, a następnie ustawiłeś boolean KWARG {X0}} do True jak w:

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]])
9
kmario23 14 kwiecień 2019, 00:20