Вы уже ответили на свой вопрос, что подчеркивание указывает на операции на месте в PyTorch.Однако я хочу кратко указать, почему операции на месте могут быть проблематичными:
Прежде всего на сайтах PyTorch рекомендуется не использовать на местеоперации в большинстве случаев.Если не работать под сильным давлением памяти, более эффективно в большинстве случаев не использует операции на месте .
https://pytorch.org/docs/stable/notes/autograd.html#in-place-operations-with-autograd
Во-вторых, естьМогут возникнуть проблемы с вычислением градиентов при использовании операций на месте:
Каждый тензор сохраняет счетчик версий, который увеличивается каждый раз, когда он помечается как грязный в любой операции.Когда функция сохраняет какие-либо тензоры для обратного, также сохраняется счетчик версий содержащего их тензора.Как только вы получаете доступ к self.saved_tensors
, оно проверяется, и если оно больше, чем сохраненное значение, возникает ошибка.Это гарантирует, что если вы используете функции на месте и не видите никаких ошибок, вы можете быть уверены, что вычисленные градиенты верны. Тот же источник, что и выше.
Вот пример и немного измененный пример, взятый из опубликованного вами ответа:
Первая версия на месте:
import torch
a = torch.tensor([2, 4, 6], requires_grad=True, dtype=torch.float)
adding_tensor = torch.rand(3)
b = a.add_(adding_tensor)
c = torch.sum(b)
c.backward()
print(c.grad_fn)
Что приводит к этой ошибке:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-27-c38b252ffe5f> in <module>
2 a = torch.tensor([2, 4, 6], requires_grad=True, dtype=torch.float)
3 adding_tensor = torch.rand(3)
----> 4 b = a.add_(adding_tensor)
5 c = torch.sum(b)
6 c.backward()
RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.
Во-вторых, не на месте версия:
import torch
a = torch.tensor([2, 4, 6], requires_grad=True, dtype=torch.float)
adding_tensor = torch.rand(3)
b = a.add(adding_tensor)
c = torch.sum(b)
c.backward()
print(c.grad_fn)
Что работаетпросто отлично - вывод:
<SumBackward0 object at 0x7f06b27a1da0>
Так что в качестве отрывка я просто хотел указать на осторожное использование операций на месте в PyTorch.