如何在没有优化器的情况下将梯度设置为零?
How to set gradients to Zero without optimizer?
在多个 .backward()
遍之间,我想将渐变设置为零。现在我必须分别为每个组件执行此操作(这里是 x
和 t
),有没有办法对所有受影响的变量执行此操作 "globally"? (我想像 z.set_all_gradients_to_zero()
。)
我知道有optimizer.zero_grad()
如果你使用优化器,但有没有不使用优化器的直接方法?
import torch
x = torch.randn(3, requires_grad = True)
t = torch.randn(3, requires_grad = True)
y = x + t
z = y + y.flip(0)
z.backward(torch.tensor([1., 0., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
x.grad.data.zero_() # both gradients need to be set to zero
t.grad.data.zero_()
z.backward(torch.tensor([0., 1., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
您也可以使用nn.Module.zero_grad()
。事实上,optim.zero_grad()
只是对传递给它的所有参数调用 nn.Module.zero_grad()
。
没有合理的方法可以在全球范围内做到这一点。您可以在列表中收集变量
grad_vars = [x, t]
for var in grad_vars:
var.grad.data = None
或者在 vars()
的基础上创建一些 hacky 函数。也许也可以检查计算图并将所有叶节点的梯度归零,但我对图不熟悉API。长话短说,您应该使用 torch.nn
的面向对象接口,而不是手动创建张量变量。
在多个 .backward()
遍之间,我想将渐变设置为零。现在我必须分别为每个组件执行此操作(这里是 x
和 t
),有没有办法对所有受影响的变量执行此操作 "globally"? (我想像 z.set_all_gradients_to_zero()
。)
我知道有optimizer.zero_grad()
如果你使用优化器,但有没有不使用优化器的直接方法?
import torch
x = torch.randn(3, requires_grad = True)
t = torch.randn(3, requires_grad = True)
y = x + t
z = y + y.flip(0)
z.backward(torch.tensor([1., 0., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
x.grad.data.zero_() # both gradients need to be set to zero
t.grad.data.zero_()
z.backward(torch.tensor([0., 1., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
您也可以使用nn.Module.zero_grad()
。事实上,optim.zero_grad()
只是对传递给它的所有参数调用 nn.Module.zero_grad()
。
没有合理的方法可以在全球范围内做到这一点。您可以在列表中收集变量
grad_vars = [x, t]
for var in grad_vars:
var.grad.data = None
或者在 vars()
的基础上创建一些 hacky 函数。也许也可以检查计算图并将所有叶节点的梯度归零,但我对图不熟悉API。长话短说,您应该使用 torch.nn
的面向对象接口,而不是手动创建张量变量。