【发布时间】:2022-02-02 22:44:26
【问题描述】:
我对 PyTorch 很陌生,我有一个关于在一个时期后将梯度归零的问题。假设我有以下训练循环:
for epoch in range(n_iters):
y_hat = forward(X)
l = loss(y, y_hat)
with torch.no_grad():
l.backward()
w -= lr * w.grad
很明显,为了不累积梯度,我需要将w 的.grad 属性归零。但是,我不确定在哪里打电话给w.grad.zero_()。我都在互联网教程中找到了在no_grad() 部分中调用它的位置以及从中调用它的位置。所以我对它们进行了测试,它们都适用于简单的线性回归。
两者有什么区别吗?如果有,哪个更好用?
【问题讨论】:
-
我还在一些代码中看到他们在
no_grad()之外调用了backward(),尤其是在使用内置优化器时。这样做是否有更多的计算成本?我读到在不需要梯度跟踪时使用no_grad()可以使代码更快。