我是 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"
?
pytorch中的torch.no_grad有什么用?
数据挖掘
Python
火炬
2021-09-13 20:22:54
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
,那么权重更新步骤将被添加到神经网络的计算图中,这是不希望的。
其它你可能感兴趣的问题