【问题标题】:pytorch grad is None after .backward()pytorch grad 在 .backward() 之后为 None
【发布时间】:2019-06-06 14:54:56
【问题描述】:

我刚刚在 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,这不是预期的。

有什么问题?

【问题讨论】:

    标签: python deep-learning neural-network pytorch


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是预期的结果。

      .backward 只在叶子节点累积梯度。 out 不是叶节点,因此 grad 是 None。

      autograd.backward 也做同样的事情

      autograd.grad 可用于查找任何张量 w.r.t 到任何张量的梯度。因此,如果您执行autograd.grad (out, out),您将得到(tensor(1.),) 作为预期的输出。

      参考:

      【讨论】:

      • here 的文档有误吗?
      • 不!请注意,他们执行x.grad 打印dout/dx。您正在打印out.grad
      • 很棒的帖子。谢谢。所以假设我们需要多次这样做,所以我们 autograd.grad(out,in,retain_graph=True)。我们需要在这里将梯度归零吗????还是每次我们调用 autograd.grad 时,它都会从零开始重新计算梯度,所以我们不需要像在 optimizer.zero_grad() 中那样???
      • 我认为你在使用autograd.grad时不需要调用zero_grad
      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 2017-10-31
      • 2021-12-04
      • 1970-01-01
      • 2020-10-13
      • 2017-09-08
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多