gpt4 book ai didi

python - 如何在 PyTorch 中获得导数的完整雅可比行列式?

转载 作者:行者123 更新时间:2023-12-03 17:02:38 24 4
gpt4 key购买 nike

让我们考虑一个简单的张量 x让我们定义另一个依赖于 x并且有多个维度:y = (x, 2x, x^2) .

我怎样才能拥有完整的渐变 dy/dx = (1,2,x) ?

例如让我们看一下代码:

import torch
from torch.autograd import grad

x = 2 * torch.ones(1)
x.requires_grad = True
y = torch.cat((x, 2*x, x*x))
# dy_dx = ???

这是我迄今为止尝试失败的方法:
>>> dy_dx = grad(y, x, grad_outputs=torch.ones_like(y), create_graph=True)
(tensor([7.], grad_fn=<AddBackward0>),)
>>> dy_dx = grad(y, x, grad_outputs=torch.Tensor([1,0,0]), create_graph=True)
(tensor([1.], grad_fn=<AddBackward0>),)
>>> dy_dx = grad(y, [x,x,x], grad_outputs=torch.eye(3), create_graph=True)
(tensor([7.], grad_fn=<AddBackward0>),)

每次我只得到部分渐变或累积版本......

我知道我可以使用 for使用第二个表达式循环,如
dy_dx = torch.zeros_like(y)
coord = torch.zeros_like(y)
for i in range (y.size(0)):
coord[i] = 1
dy_dx[i], = grad(y, x, grad_outputs=coord, create_graph=True)
coord[i] = 0

然而,当我处理高维张量时,这个 for循环可能需要太多时间来计算。此外,必须有一种方法可以在不累积梯度的情况下执行完整的雅可比...

有没有人有解决方案?还是另一种选择?

最佳答案

torch.autograd.grad在 PyTorch 中是聚合的。要使向量相对于输入自动微分,请使用 torch.autograd.functional.jacobian .

关于python - 如何在 PyTorch 中获得导数的完整雅可比行列式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57378143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com