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.
我怎样才能解决这个问题?
这个错误实际上是由 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)
归档时间: |
|
查看次数: |
7295 次 |
最近记录: |