关于 pytorch inplace operation, 需要知道的几件事
x = torch.tensor([1,2,3], dtype=float, requires_grad=True)
print(x.requires_grad)
with torch.no_grad():
#x = x+2 # 此句话改变了原来的x内存地址,又因在with torch.no_grad中,
# 所以新的x的requires_grad=False
#x.add_(2) # 类似x+=2,在原来的内存地址上变化,x.requires_grad=True
x *= 2
print(x.grad)
y = x.sum()
print(x.requires_grad)
print(y.requires_grad)
print(x.is_leaf)
y.backward()
print(x.grad)
----------------
True
None
True
True
True
tensor([1., 1., 1.], dtype=torch.float64)
注意这里的梯度如果没有with torch.no_grad():,结果应当是[2.,2.,2.]
计算图叶子节点一般不能进行原地操作,但是在with torch.no_grad():中是可以的,并且不会放进计算图中