在训练损失循环中到底应该在哪里使用zero_grad()?在计算损失之前或之后这样做会改变事情吗?

问题描述 投票:0回答:1

所以我知道你需要在向后传递之前将梯度归零,因为这样做的原因很明显。不过,我对在哪里添加 Zero_grad() 感到困惑,因为我已经看到示例将其放在循环开始处或在 loss.backward() 之前,而且我无法判断哪个是正确的,或者如果有很大差异的话。

我确实尝试过这个,并注意到我所有的准确度计算都发生了变化,但这让我有点好奇原因可能是什么,以及它是否很重要。

python deep-learning pytorch neural-network
1个回答
0
投票

所以,这两种情况都在

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()

我想是为了让代码更容易阅读并更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.