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,而毕业生有一个不同的。我已经编辑了答案,希望它能工作!