pytorch中的torch.no_grad有什么用?

数据挖掘 Python 火炬
2021-09-13 20:22:54

我是 pytorch 的新手,从这个github 代码开始。我不明白代码中第 60-61 行的注释"because weights have requires_grad=True, but we don't need to track this in autograd"我知道我们提到requires_grad=True了我们需要计算梯度以使用 autograd 的变量,但这意味着什么"tracked by autograd"

4个回答

包装器with torch.no_grad()临时将所有requires_grad标志设置为 false。一个示例来自官方 PyTorch 教程

x = torch.randn(3, requires_grad=True)
print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)

输出:

True
True
False

我建议您阅读上面链接中的所有教程。

在您的示例中:我猜作者不希望 PyTorch 计算新定义的变量 w1 和 w2 的梯度,因为他只想更新它们的值。

Torch.no_grad()停用 autograd 引擎。最终它将减少内存使用并加快计算速度。

用途Torch.no_grad()

  • 在没有梯度计算的情况下执行推理。

  • 确保模型中没有泄漏测试数据。

它通常用于执行验证。在这种情况下,可以使用大尺寸的验证批次。

with torch.no_grad()

将使块中的所有操作都没有梯度。

在 pytorch 中,您不能对 w1 和 w2 进行就地更改,这两个变量是require_grad = True. 我认为避免 w1 和 w2 的位置变化是因为它会导致反向传播计算错误。由于就地变化将完全改变 w1 和 w2。

但是,如果你使用 this no_grad(),你可以控制 new w1 和 new w2 没有梯度,因为它们是由操作生成的,这意味着你只改变 w1 和 w2 的值,而不是梯度部分,它们仍然有之前定义的可变梯度信息并且反向传播可以继续。

我认为如果我们不使用torch.no_grad,那么权重更新步骤将被添加到神经网络的计算图中,这是不希望的。