mindspore.ops.jet

mindspore.ops.jet(fn, primals, series)[源代码]

计算函数或网络输出对输入的高阶微分。给定待求导函数的原始输入和自定义的1到n阶导数,将返回函数输出对输入的第1到n阶导数。一般情况,建议输入的1阶导数值为全1,更高阶的导数值为全0,这与输入对本身的导数情况是一致的。

Note

  • primals 是int型的Tensor,会被转化成float32格式进行计算。

参数:

  • fn (Union[Function, Cell]) - 待求导的函数或网络。

  • primals (Union[Tensor, tuple[Tensor]]) - fn 的输入,单输入的type为Tensor,多输入的type为Tensor组成的tuple。

  • series (Union[Tensor, tuple[Tensor]]) - 输入的原始第1到第n阶导数。若为tuple则长度与数据类型应与 primals 一致。type与 primals 相同,Tensor第一维度i对应输出对输入的第1到第i+1阶导数。

返回:

tuple,由 out_primalsout_series 组成。

  • out_primals (Union[Tensor, list[Tensor]]) - fn(primals) 的结果。

  • out_series (Union[Tensor, list[Tensor]]) - fn 输出对输入的第1到n阶导数。

异常:

  • TypeError - primals 不是Tensor或tuple。

  • TypeError - primalsseries 的type不一致。

支持平台:

Ascend GPU CPU

样例:

>>> import numpy as np
>>> import mindspore.nn as nn
>>> import mindspore as ms
>>> import mindspore.ops as P
>>> from mindspore import Tensor
>>> from mindspore.ops.functional import jet
>>> ms.set_context(mode=ms.GRAPH_MODE)
>>> class Net(nn.Cell):
...     def __init__(self):
...         super().__init__()
...         self.sin = P.Sin()
...         self.exp = P.Exp()
...     def construct(self, x):
...         out1 = self.sin(x)
...         out2 = self.exp(out1)
...         return out2
>>> primals = Tensor(np.array([[1, 2], [3, 4]]).astype(np.float32))
>>> series = Tensor(np.array([[[1, 1], [1, 1]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]).astype(np.float32))
>>> net = Net()
>>> out_primals, out_series = jet(net, primals, series)
>>> print(out_primals, out_series)
[[2.319777  2.4825778]
 [1.1515628 0.4691642]] [[[ 1.2533808  -1.0331168 ]
  [-1.1400385  -0.3066662 ]]
 [[-1.2748207  -1.8274734 ]
  [ 0.966121    0.55551505]]
 [[-4.0515366   3.6724353 ]
  [ 0.5053504  -0.52061415]]]