pytorch grad 在 .backward() 之后是 None



我刚刚在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中返回中间梯度(对于非叶节点)?)。

最新更新