【问题标题】:Calculate Second Gradient with PyTorch使用 PyTorch 计算第二个梯度
【发布时间】:2021-05-28 01:42:26
【问题描述】:

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

【问题讨论】:

标签: python pytorch


【解决方案1】:

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

>>> 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 个导数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多