快捷方式

torch.autograd.functional.jacobian

torch.autograd.functional.jacobian(func, inputs, create_graph=False, strict=False, vectorize=False, strategy='reverse-mode')[source][source]

计算给定函数的雅可比矩阵。

参数
  • func (function) – 一个 Python 函数,接受 Tensor 输入并返回一个 Tensor 或一个包含 Tensor 的元组。

  • inputs (Tensors 元组Tensor) – 函数 func 的输入。

  • create_graph (bool, 可选) – 如果为 True,雅可比矩阵将以可微分的方式计算。请注意,当 strictFalse 时,结果可能不需要梯度或与输入断开连接。默认为 False

  • strict (bool, 可选) – 如果为 True,当我们检测到存在某个输入,所有输出都与其无关时,将引发错误。如果为 False,则对于这些输入,我们将返回一个全零 Tensor 作为雅可比矩阵,这是预期的数学值。默认为 False

  • vectorize (bool, 可选) – 此特性为实验性。如果您寻求更稳定且性能更好的功能,请考虑改用torch.func.jacrev()torch.func.jacfwd()。在计算雅可比矩阵时,通常每计算雅可比矩阵的一行都会调用一次 autograd.grad。如果此标志为 True,我们将仅执行一次 autograd.grad 调用,并设置 batched_grad=True,它使用了 vmap 原型特性。虽然这在许多情况下会带来性能提升,但由于此特性仍处于实验阶段,可能存在性能瓶颈。更多信息请参见 torch.autograd.grad()batched_grad 参数。

  • strategy (str, 可选) – 设置为 "forward-mode""reverse-mode",以确定使用前向模式 AD 还是反向模式 AD 计算雅可比矩阵。目前,"forward-mode" 需要 vectorized=True。默认为 "reverse-mode"。如果 func 的输出多于输入,"forward-mode" 倾向于性能更优。否则,优先使用 "reverse-mode"

返回值

如果只有一个输入和一个输出,这将是一个包含线性化输入和输出的雅可比矩阵的单个 Tensor。如果其中一个为元组,则雅可比矩阵将是 Tensors 的元组。如果两者都是元组,则雅可比矩阵将是 Tensors 元组的元组,其中 Jacobian[i][j] 包含第 i 个输出和第 j 个输入的雅可比矩阵,其大小将是对应输出和对应输入大小的拼接,并且与对应输入具有相同的 dtype 和 device。如果 strategy 为 forward-mode,dtype 将与输出相同;否则,与输入相同。

返回类型

雅可比矩阵 (Tensor 或 Tensors 的嵌套元组)

示例

>>> def exp_reducer(x):
...     return x.exp().sum(dim=1)
>>> inputs = torch.rand(2, 2)
>>> jacobian(exp_reducer, inputs)
tensor([[[1.4917, 2.4352],
         [0.0000, 0.0000]],
        [[0.0000, 0.0000],
         [2.4369, 2.3799]]])
>>> jacobian(exp_reducer, inputs, create_graph=True)
tensor([[[1.4917, 2.4352],
         [0.0000, 0.0000]],
        [[0.0000, 0.0000],
         [2.4369, 2.3799]]], grad_fn=<ViewBackward>)
>>> 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.]]))

文档

访问 PyTorch 全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深度教程

查看教程

资源

查找开发资源并获得问题解答

查看资源