使用 PyTorch 计算第二梯度

时间:2021-05-17 19:14:30

标签: python pytorch

在 PyTorch 中,有两种计算二次梯度的方法。第一种方法是使用torch.autograd.grad函数,另一种是使用backward函数。我用下面的例子来说明:

方法一:

x=torch.tensor([3.0], requires_grad=True)
y = torch.pow(x, 2)
grad_1 = torch.autograd.grad(y, x, create_graph=True)
print(grad_1[0].item())
grad_2 = torch.autograd.grad(grad_1[0], x)
print(grad_2)

结果对我来说很有意义,函数的第二个梯度是 2。

方法二:

x=torch.tensor([3.0], requires_grad=True)
y = torch.pow(x, 2) # y=x**2
y.backward(retain_graph=True)
print(x.grad)

y.backward()
print(x.grad)

在计算第一个梯度时,我使用 create_graph=True 来确保我们可以使用反向传播方法来计算第二个梯度。但是,结果是12,这是错误的。我想知道第二种方法有什么问题?

1 个答案:

答案 0 :(得分:0)

使用 grad 中的 torch.autograd 方法来区分您的函数。所以步骤是:

>>> import torch
>>> from torch.autograd import grad

>>> x = torch.tensor([3.0], requires_grad=True)
>>> y = torch.pow(x,2)

>>> z = grad(y, x, create_graph=True)
>>> print(grad(z, x, create_graph=True))
>>> (tensor([2.], grad_fn=<MulBackward0>),)

同样,您可以循环生成第 n 个导数。