pytorch grad在.backward()之后为None

时间:2019-01-11 16:41:07

标签: pytorch

我刚刚在 Python 3.7.2 (macOS)上安装了 torch-1.0.0 ,并尝试了tutorial,但代码如下:

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,这不是预期的结果。

出什么问题了?

2 个答案:

答案 0 :(得分:2)

这是预期的结果。

.backward仅在叶节点中累积梯度。 out不是叶节点,因此grad为None。

autograd.backward也做同样的事情

autograd.grad可用于查找任意张量到任意张量的梯度。因此,如果您进行autograd.grad (out, out),则会得到(tensor(1.),)作为预期的输出。

参考

答案 1 :(得分:1)

如果您想要非叶梯度,您可以在非叶张量上使用 register_hook 以将它们保存在某处(如以下答案所示:How to return intermideate gradients (for non-leaf nodes) in pytorch?)。