`RuntimeError: 张量的元素 0 不需要 grad 并且没有 grad_fn` 用于使用 torch 进行梯度下降的线性回归

Out*_*ime 1 error-handling linear-regression gradient-descent pytorch

我正在尝试使用 pytorch 实现线性回归的简单梯度下降,如文档中的此示例所示:

import torch
from torch.autograd import Variable

learning_rate = 0.01
y = 5
x = torch.tensor([3., 0., 1.])
w = torch.tensor([2., 3., 9.], requires_grad=True)
b = torch.tensor(1., requires_grad=True)

for z in range(100):
    y_pred = b + torch.sum(w * x)
    loss = (y_pred - y).pow(2)
    loss = Variable(loss, requires_grad = True)
    # loss.requires_grad = True
    loss.backward()
    
    with torch.no_grad():
        w = w - learning_rate * w.grad
        b = b - learning_rate * b.grad
        
        w.grad = None
        b.grad = None
Run Code Online (Sandbox Code Playgroud)

当我运行代码时出现错误RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

我已经读过这里这里,它可以解决

使用

  • loss = Variable(loss, requires_grad = True)结果是TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'

  • loss.requires_grad = True导致RuntimeError: you can only change requires_grad flags of leaf variables.

我怎样才能解决这个问题?

Out*_*ime 5

这个错误实际上是由 python 内置函数混合计算函数引起的torch(numpy 或其他不是 torch 的库也应该如此)。这实际上意味着 torch 的 autograd 实现正在崩溃,因为它们不能与其他函数一起使用。

可以在这里阅读一个很好的解释


这更像是一个不完全合适的黑客:

向后调用.retain_grad()之前为我解决了这个问题:

learning_rate = 0.01
y = 5
x = torch.tensor([3., 0., 1.])
w = torch.tensor([2., 3., 9.], requires_grad=True)
b = torch.tensor(1., requires_grad=True)

for z in range(100):
    y_pred = b + torch.sum(w * x)
    loss = (y_pred - y).pow(2)
    
    w.retain_grad()
    b.retain_grad()
    loss.backward()
    
    w = w - learning_rate * w.grad
    b = b - learning_rate * b.grad
Run Code Online (Sandbox Code Playgroud)