翻译自https://discuss.pytorch.org/t/zero-grad-optimizer-or-net/1887,本文只做个人记录学习使用,版权归原作者所有。
在基于pytorch的神经网络训练代码中,经常看到optimizer.zero_grad()和net.zero_grad()进行梯度清零操作,但是这两者有什么区别呢?PyTorch论坛上有人给出了解释,特此记录。
也就是说,如果
optimizer=optim.Optimizer(net.parameters())
optimizer.zero_grad()和net.zero_grad()是等价的,原因在于zero_grad()函数的定义:
def zero_grad(self):
"""Sets gradients of all model parameters to zero."""
for p in self.parameters():
if p.grad is not None:
p.grad.data.zero_()