我刚刚在 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
,这不是预期的结果。
出什么问题了?
答案 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?)。