Pytorch 不使用.data更新net.parameters()
有没有什么方法可以用其他带有梯度的张量来更新网络参数 我想做如下事情:Pytorch 不使用.data更新net.parameters(),pytorch,autograd,Pytorch,Autograd,有没有什么方法可以用其他带有梯度的张量来更新网络参数 我想做如下事情: grads = torch.autograd.grad(loss, net.parameters(), create_graph=True) for param gi in zip(net.parameters(), grads): param -= eps * gi 我希望每个参数都带有gi的梯度fn。您可以通过使用火炬包裹整个
grads = torch.autograd.grad(loss, net.parameters(),
create_graph=True)
for param gi in zip(net.parameters(), grads):
param -= eps * gi
我希望每个参数都带有gi的梯度fn。您可以通过使用
火炬包裹整个循环来实现这一点。no_grad()
:
或者,您可以使用param
上的数据属性:
grads = torch.autograd.grad(loss, net.parameters(), create_graph=True)
for param, gi in zip(net.parameters(), grads):
param.data.copy_(param.data - eps*gi)
据我测试,这两种方法都以相同的方式更新参数
不过,我还没有找到任何方法来复制grad\u fn
属性。作为一种解决方法,您可以复制到gi
而不是param
,这将用模型的新参数覆盖梯度的值:
grads = torch.autograd.grad(loss, net.parameters(), create_graph=True)
for param, gi in zip(net.parameters(), grads):
gi.data.copy_(param.data - eps*gi)
如果您需要保持grads
未修改,只需在进入循环之前克隆它。您可以通过使用火炬包装整个循环来完成此操作。no_grad()
:
或者,您可以使用param
上的数据属性:
grads = torch.autograd.grad(loss, net.parameters(), create_graph=True)
for param, gi in zip(net.parameters(), grads):
param.data.copy_(param.data - eps*gi)
据我测试,这两种方法都以相同的方式更新参数
不过,我还没有找到任何方法来复制grad\u fn
属性。作为一种解决方法,您可以复制到gi
而不是param
,这将用模型的新参数覆盖梯度的值:
grads = torch.autograd.grad(loss, net.parameters(), create_graph=True)
for param, gi in zip(net.parameters(), grads):
gi.data.copy_(param.data - eps*gi)
如果您需要保持grads
未修改,只需在进入循环之前克隆它即可。谢谢。但更新后的参数不包含梯度的梯度。那是我的问题。他们的grad\u fn是requires\u grad=True,而毕业生有一个不同的。我已经编辑了答案,希望它能工作!谢谢但更新后的参数不包含梯度的梯度。那是我的问题。他们的grad\u fn是requires\u grad=True,而毕业生有一个不同的。我已经编辑了答案,希望它能工作!