所以我知道你需要在向后传递之前将梯度归零,因为这样做的原因很明显。不过,我对在哪里添加 Zero_grad() 感到困惑,因为我已经看到示例将其放在循环开始处或在 loss.backward() 之前,而且我无法判断哪个是正确的,或者如果有很大差异的话。
我确实尝试过这个,并注意到我所有的准确度计算都发生了变化,但这让我有点好奇原因可能是什么,以及它是否很重要。
所以,这两种情况都在
backward()
函数之前。那么无论你把它放在哪里,只要放在 backward()
之前就可以了。这实际上取决于编写它的人的编码风格。
通常,如果只有一项优化,那么人们倾向于将
opt.zero_grad()
放在循环的开头。但如果你的模型有点复杂,有不止一种优化。然后我倾向于做类似的事情:
encoder_opt.zero_grad()
encoder_loss = ...
encoder_loss.backward()
encoder_opt.step()
decoder_opt.zero_grad()
decoder_loss = ...
decoder_loss.backward()
decoder_opt.step()
我想是为了让代码更容易阅读并更清晰。