文章目录
一、in-place含义
in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以称之为“原地操作符”。
注意:PyTorch操作inplace版本都有后缀"_
", 例如y.add_(x)
,x.copy_(y)
,x.t_()
python里面的+=
,*=
也是in-place operation
如果你使用了in-place operation而没有报错的话,那么你可以确定你的梯度计算是正确的。
二、in-place代码示例
import torch
x = torch.rand(5, 3)
y = torch.rand(5, 3)
# 加法形式一:+
print(x + y)
# 加法形式二:add
print(torch.add(x, y))
# add还可指定输出
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
# 加法形式三:inplace
y.add_(x) # adds x to y
print(y)
三、在pytorch中, 有两种情况不能使用inplace operation
1、对于requires_grad=True
的叶子张量(leaf tensor) 不能使用 inplace operation
2、对于在求梯度阶段需要用到的张量
不能使用 inplace operation
第一种情况: requires_grad=True 的 leaf tensor
import torch
w = torch.FloatTensor(10) # w 是个 leaf tensor
w.requires_grad = True # 将 requires_grad 设置为 True
w.normal_()