在 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,这是错误的。我想知道第二种方法有什么问题?
答案 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 个导数。