torch.autograd.functional.jacobian¶
- torch.autograd.functional.jacobian(func, inputs, create_graph=False, strict=False, vectorize=False, strategy='reverse-mode')[源代码]¶
计算给定函数的雅可比矩阵。
- Parameters
func (函数) – 一个接受张量输入并返回张量元组或单个张量的Python函数。
create_graph (bool, 可选) – 如果
True,雅可比矩阵将以可微分的方式计算。请注意,当strict为False时,结果不能需要梯度或与输入断开连接。默认为False。严格 (布尔值, 可选) – 如果
True,当我们检测到存在一个输入,使得所有输出都与它无关时,将引发错误。如果False,我们将返回一个零张量作为该输入的雅可比矩阵,这是预期的数学值。默认为False。向量化 (布尔值, 可选) – 此功能是实验性的。 请考虑使用
torch.func.jacrev()或torch.func.jacfwd()如果你在寻找一些 不那么实验性且性能更好的东西。 在计算雅可比矩阵时,通常我们为雅可比矩阵的每一行调用一次autograd.grad。如果此标志为True,我们只执行一次autograd.grad调用,并使用batched_grad=True,这使用了 vmap 原型功能。 尽管在许多情况下这应该会带来性能提升, 但由于此功能仍然是实验性的,可能会有性能悬崖。请参阅torch.autograd.grad()的batched_grad参数以获取更多信息。策略 (字符串, 可选) – 设置为
"forward-mode"或"reverse-mode"以 确定雅可比矩阵将使用前向模式还是反向模式自动微分进行计算。目前,"forward-mode"需要vectorized=True。 默认为"reverse-mode"。如果func的输出多于 输入,"forward-mode"通常更具性能。否则, 建议使用"reverse-mode"。
- Returns
如果只有一个输入和输出,这将是一个包含线性化输入和输出的雅可比矩阵的单一张量。如果其中一个是元组,那么雅可比矩阵将是一个张量元组。如果两者都是元组,那么雅可比矩阵将是一个张量元组的元组,其中
Jacobian[i][j]将包含第i个输出和第j个输入的雅可比矩阵,并且其大小将是相应输出和输入大小的连接,并且将与相应输入具有相同的 dtype 和设备。如果策略是forward-mode,则 dtype 将是输出的 dtype;否则,将是输入的 dtype。- Return type
雅可比矩阵(Tensor 或嵌套的 Tensor 元组)
示例
>>> def exp_reducer(x): ... return x.exp().sum(dim=1) >>> inputs = torch.rand(2, 2) >>> jacobian(exp_reducer, inputs) 张量([[[1.4917, 2.4352], [0.0000, 0.0000]], [[0.0000, 0.0000], [2.4369, 2.3799]]])
>>> jacobian(exp_reducer, inputs, create_graph=True) 张量([[[1.4917, 2.4352], [0.0000, 0.0000]], [[0.0000, 0.0000], [2.4369, 2.3799]]], grad_fn=
) >>> def exp_adder(x, y): ... return 2 * x.exp() + 3 * y >>> inputs = (torch.rand(2), torch.rand(2)) >>> jacobian(exp_adder, inputs) (tensor([[2.8052, 0.0000], [0.0000, 3.3963]]), tensor([[3., 0.], [0., 3.]]))