在这种情况下,为什么torch.autograd不计算梯度?</ p>
import torch
x = torch.tensor([1., 2., ], requires_grad=True)
y = torch.tensor([x[0] + x[1], x[1] - x[0], ], requires_grad=True)
z = y[0] + y[1]
z.backward()
x.grad
输出为空行(无)。 x[0].grad
也会发生同样的情况。为什么?
PS:回想起来,我意识到用y
使requires_grad
成为张量的动机是,所以我可以检查它自己的梯度。我了解到必须在此使用retain_grad
:Why does autograd not produce gradient for intermediate variables?
答案 0 :(得分:1)
当将torch.tensor
用于y
时,它仅使用x
的值来初始化张量,则梯度链丢失。
这有效:
x = torch.tensor([1., 2., ], requires_grad=True)
y = [x[0] + x[1], x[1] - x[0], ]
z = y[0] + y[1]
z.backward()
x.grad
结果为tensor([0., 2.])