1.
a[:,0,:,:]+=b[:,0,:,:]
是in-place.
2.
a=a[:,1:,:,:] 不是in-place.
3
a=a.permute(0,3,1,2) 不是in-place.
a view of a leaf Variable that requires grad is being used in an in-place operation. 在具有梯度的不能进行in-place操作,这条torch的禁忌大大阻碍了我的前进。 当requires_grad=True以后,就不能采用in-place操作了。但是在之前是可以的,以下的代码可以运行:
import torch
from torch.autograd import Variable
a =torch.ones((10,3,10,10),dtype=torch.float32)
a.requires_grad=True
b=torch.mul(a,a)+a
d=torch.zeros((1))
d[0]=b[0,0,0,1]
mask = torch.zeros_like(a)
mask[0,0,0,1]=1
mygrad = compute_grad_element_wise(d,a)
mygrad=mygrad*mask
print(mygrad)
print(mask)
print(mask.requires_grad)
print(mygrad.requires_grad)
如果你还拿不准,更通俗一点讲,中括号出现在等号右边不是in-place, 肯定没事,出现在左边就是in-place,要小心。 此外,在grad函数的使用当中,对谁求导,这个“谁”,必须要求不能为in-place形式。前面的y倒是可以随便。 即: grad(y[0],x,…)是对的 grad(y,x[0],…)是错的
正确代码
gradient=torch.tensor([[1.0],[1.0]])
#后面加[0]可以把tuple变成tensor类型,非常重要
grad_x = torch.autograd.grad(y[0], x, create_graph=True)[0]
print(grad_x)
# grad_y_x = torch.autograd.grad(grad_x, x,gradient, create_graph=True)
# print(grad_y_x)
错误代码
gradient=torch.tensor([[1.0],[1.0]])
#后面加[0]可以把tuple变成tensor类型,非常重要
grad_x = torch.autograd.grad(y[0], x[0], create_graph=True)[0]
print(grad_x)
# grad_y_x = torch.autograd.grad(grad_x, x,gradient, create_graph=True)
# print(grad_y_x)
|