В чем разница между sum и torch.sum для тензора torch?

#pytorch

#pytorch

Вопрос:

Я получаю те же результаты при использовании либо python sum, либо torch.sum так почему torch реализовал функцию sum? Есть ли разница между ними?

Ответ №1:

ничего, torch.sum вызовы tensor.sum и sum вызовы __add__ python (или __radd__ при необходимости), которые вызывают tensor.sum снова

таким образом, разница заключается только в количестве вызовов функций, и tensor.sum() она должна быть самой быстрой (когда у вас маленькие тензоры и накладные расходы на вызов функции значительны)

Комментарии:

1. Я обнаружил, sum что это иногда полезно, например, для вычисления потерь в последовательности, сгенерированной сетью. Можно использовать генератор для получения тензоров потерь и их суммирования без необходимости создавать промежуточный тензор с помощью torch.stack/cat . Я считаю , что это более эффективно или может избавить вас от нехватки памяти, если вы имеете дело с большими тензорами или длинными последовательностями.

Ответ №2:

Похоже, что python sum может принимать генераторы в качестве входных данных, тогда как torch.sum не может:

import torch
print( sum( torch.ones(1)*k for k in torch.arange(10)))
возвращает tensor([45.]) , тогда как:

print( torch.sum( torch.ones(1)*k for k in torch.arange(10)))
вызывает TypeError: sum(): argument 'input' (position 1) must be Tensor, not generator

Я предполагаю, что обратное распространение PyTorch приведет к проблемам с отложенной оценкой генератора, но пока не уверен в этом.

Комментарии:

1. Никаких проблем с backprop, поскольку он просто вызывает __add__ и строит график поверх него.