#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__
и строит график поверх него.