我刚刚在Python 3.7.2(macOS)上安装了torch-1.0.0,并尝试了本教程,但以下代码:
import torch
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()
print(out.grad)
打印None
这不是预期的。
怎么了?
这是预期的结果。
.backward
仅在叶节点中累积梯度。 out
不是叶节点,因此 grad 是 None。
autograd.backward
也做同样的事情
autograd.grad
可用于查找任何张量 w.r.t 到任何张量的梯度。因此,如果您这样做autograd.grad (out, out)
您将获得(tensor(1.),)
作为输出,这是预期的。
裁判:
- Tensor.backward (https://pytorch.org/docs/stable/autograd.html#torch.Tensor.backward)
- Autograd.backward (https://pytorch.org/docs/stable/autograd.html#torch.autograd.backward)
- Autograd.grad (https://pytorch.org/docs/stable/autograd.html#torch.autograd.grad)
如果你想要非叶子梯度,你可以在你的非叶张量上使用register_hook
,以便将它们保存在某个地方(如以下答案所示:如何在pytorch中返回中间梯度(对于非叶节点)?)。