我知道两种从梯度计算中排除计算元素的方法 backward
方法一:使用with torch.no_grad()
with torch.no_grad():
y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y)
loss.backward();
方法二:使用.detach()
y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y.detach())
loss.backward();
这两者有区别吗?两者都有优点/缺点吗?
tensor.detach()
创建一个与不需要 grad 的张量共享存储的张量。它将输出与计算图分离。所以没有梯度会沿着这个变量反向传播。
带有 torch.no_grad() 的包装器
暂时将所有 requires_grad
标志设置为 false。 torch.no_grad
表示没有任何操作应该构建图形。
不同之处在于,一个只引用调用它的给定变量。另一个影响 with
语句中发生的所有操作。此外,torch.no_grad
将使用更少的内存,因为它从一开始就知道不需要梯度,因此不需要保留中间结果。
通过 here 中的示例详细了解它们之间的差异.
我是一名优秀的程序员,十分优秀!