以下三句代码在pytorch训练神经网络中非常常见,是用来计算梯度,更新网络参数的一种操作。
总得来说,是先将梯度归零(optimizer.zero_grad()),然后反向传播计算得到每个参数的梯度值(loss.backward()),最后通过梯度下降执行一步参数更新(optimizer.step())。
具体每一句的含义与作用如下
optimizer.zero_grad()
loss.backward()
optimizer.step()
optimizer.zero_grad()
optimizer.zero_grad()函数会遍历模型的所有参数,通过p.grad.detach_()方法截断反向传播的梯度流,再通过p.grad.zero_()函数将每个参数的梯度值设为0,即上一次的梯度记录被清空。
因为训练的过程通常使用 batch ,所以如果不将梯度清零的话,梯度会与上一个batch的数据相关,因此在反向传播和梯度下降之前需要将梯度进行清空。
def zero_grad(self):
r"""Clears the gradients of all optimized :class:`torch.Tensor` s."""
for group in self.param_groups:
for p in group['params']:
if p.grad is not None:
p