Подтвердить что ты не робот

Факел суммирует тензор вдоль оси

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

Как я могу суммировать по столбцам?

4b9b3361

Ответ 1

Самое простое и лучшее решение - использовать 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]

Ответ 2

В качестве альтернативы вы можете использовать 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])

Как видно из приведенных выше выходов, в обоих случаях выход представляет собой одномерный тензор. Если, с другой стороны, вы также хотите сохранить размер исходного тензора в выходных данных, тогда вы установили для логического значения 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]])

Ответ 3

Если у вас есть тензор my_tensor, и вы хотите суммировать по второму измерению массива (то есть, с индексом 1, который является размерностью столбца, если тензор двумерный, как у вас), используйте torch.sum(my_tensor,1) или эквивалентно my_tensor.sum(1) см. документацию здесь.

Одна вещь, которая явно не упоминается в документации: вы можете суммировать по последнему измерению массива с помощью -1 (или второго по последнему измерению с -2 и т.д.)

Итак, в вашем примере вы можете использовать: outputs.sum(1) или torch.sum(outputs,1) или, что эквивалентно, outputs.sum(-1) или torch.sum(outputs,-1). Все это даст один и тот же результат - выходной тензор размера torch.Size([10]), где каждая запись является суммой по всем строкам в данном столбце outputs тензора.

Для иллюстрации с трехмерным тензором:

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