torch.no_grad() 的目的是什么:

Gau*_*sra 9 python gradient machine-learning linear-regression pytorch

考虑以下使用 PyTorch 实现的线性回归代码:

X是输入,Y是训练集的输出,w是需要优化的参数
import torch

X = torch.tensor([1, 2, 3, 4], dtype=torch.float32)
Y = torch.tensor([2, 4, 6, 8], dtype=torch.float32)

w = torch.tensor(0.0, dtype=torch.float32, requires_grad=True)

def forward(x):
    return w * x

def loss(y, y_pred):
    return ((y_pred - y)**2).mean()

print(f'Prediction before training: f(5) = {forward(5).item():.3f}')

learning_rate = 0.01
n_iters = 100

for epoch in range(n_iters):
    # predict = forward pass
    y_pred = forward(X)

    # loss
    l = loss(Y, y_pred)

    # calculate gradients = backward pass
    l.backward()

    # update weights
    #w.data = w.data - learning_rate * w.grad
    with torch.no_grad():
        w -= learning_rate * w.grad
    
    # zero the gradients after updating
    w.grad.zero_()

    if epoch % 10 == 0:
        print(f'epoch {epoch+1}: w = {w.item():.3f}, loss = {l.item():.8f}')
Run Code Online (Sandbox Code Playgroud)

“with”块有什么作用?w 的 require_grad 参数已设置为 True。为什么它被放在 with torch.no_grad() 块下?

Bob*_*opo 7

requires_grad参数告诉 PyTorch 我们希望能够计算这些值的梯度。然而,with torch.no_grad()告诉 PyTorch 不要计算梯度,并且程序在此处明确使用它(与大多数神经网络一样),以便在更新权重时不更新梯度,因为这会影响反向传播。


小智 3

更新权重时没有理由跟踪梯度;这就是为什么您会在优化器的任何实现中找到用于步骤方法的装饰器(@torch.no_grad())。

“With torch.no_grad”块意味着在不跟踪渐变的情况下执行这些行。