首先说一种踩过的坑
import torch
X=torch.Tensor([1,2,3])
X.requires_grad=True
print(X)
y=torch.sum(X**2*2)
y.backward()
'''模拟参数更新'''
lr=0.1
X=torch.Tensor(X-X.grad.data*lr)
print(X)
print(X.grad.data)
这是不能实现的
如果你曾经见过这种报错,那么恭喜你,你和我踩了一样的坑。
问题出在参数更新部分,也就是说X也需要.data才能正常赋值,改成这样就可以了
import torch
X=torch.Tensor([1,2,3])
X.requires_grad=True
print(X)
y=torch.sum(X**2*2)
y.backward()
'''模拟参数更新'''
lr=0.1
X.data=X.data-X.grad.data*lr
print(X)
print(X.grad.data)
X.grad.data.zero_()
print(X.grad.data)
'''第二次参数更新'''
y=torch.sum(X**2*2)
y.backward()
print(X.grad.data)
上面是最常见的更新方式
还有一种自创的,
import torch
X=torch.Tensor([1,2,3])
X.requires_grad=True
print(X)
y=torch.sum(X**2*2)
y.backward()
'''模拟参数更新'''
lr=0.1
d_x=X.grad.data
print(d_x)
X1=X.detach()-d_x*lr
X=torch.Tensor(X1)
X.requires_grad=True
print(X)
#第二次反向传播
y=torch.sum(X**2*2)
y.backward()
print(X.grad.data)
这种是直接用梯度更新后的值新建一个节点,再将新建节点的requires_grad设为True,这样做的好处是不用再梯度清零了。