在PyTorch中,Tensor的许多方法有两种版本--一种有下划线后缀,另一种没有。如果我尝试它们,它们似乎做了同样的事情:
In [1]: import torch
In [2]: a = torch.tensor([2, 4, 6])
In [3]: a.add(10)
Out[3]: tensor([12, 14, 16])
In [4]: a.add_(10)
Out[4]: tensor([12, 14, 16])
有什么区别
torch.add
和torch.add_
torch.sub
和torch.sub_
- ...等等?
3条答案
按热度按时间2w2cym1i1#
https://pytorch.org/docs/stable/notes/autograd.html#in-place-operations-with-autograd
每个Tensor都有一个版本计数器,每当它在任何操作中被标记为脏的时候,它就会递增。当函数保存任何向后的Tensor时,它们所包含的Tensor的版本计数器也会被保存。一旦你访问
self.saved_tensors
,它就会被检查,如果它大于保存的值,就会引发错误。这确保了如果你正在使用就地函数,并且没有看到任何错误。你可以确保计算的梯度是正确的。* 与上面的源相同。*下面是一个从你发布的答案中截取的经过略微修改的示例:
首先是就地版本:
导致此错误:
其次是非就地版本:
工作正常-输出:
所以,作为一个外卖,我只是想指出,要小心使用在PyTorch的地方操作。
rlcwz9us2#
根据documentation,以下划线结尾的方法会改变Tensorin-place。这意味着执行该操作不会分配新的内存,通常increase performance,但会导致问题和更差的PyTorch性能。
Tensor.add():
Tensor.add_():
请注意,运算符
+
和+=
也是两种不同的实现。+
通过使用.add()
创建新Tensor,而+=
通过使用.add_()
修改Tensorjv2fixgn3#
在PyTorch中,以下划线结尾,这是PyTorch中的一种约定,表示该方法不会返回新的Tensor,而是在适当的位置修改Tensor。例如,
scatter_
。https://yuyangyy.medium.com/understand-torch-scatter-b0fd6275331c