当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PyTorch gradient用法及代码示例


本文简要介绍python语言中 torch.gradient 的用法。

用法:

torch.gradient(input, *, spacing=1, dim=None, edge_order=1) → List of Tensors

参数

input(Tensor) -表示函数值的张量

关键字参数

  • spacing(scalar,list of scalar,list of Tensor, 可选的) -spacing 可用于修改 input 张量的索引与样本坐标的关系。如果spacing 是标量,则索引乘以标量以产生坐标。例如,如果 spacing=2 索引 (1, 2, 3) 变为坐标 (2, 4, 6)。如果spacing 是标量列表,则相应的索引相乘。例如,如果 spacing=(2, -1, 3) 索引 (1, 2, 3) 变为坐标 (2, -2, 9)。最后,如果spacing 是一维张量的列表,则每个张量都指定相应维度的坐标。例如,如果索引为 (1, 2, 3),张量为 (t0, t1, t2),则坐标为 (t0[1], t1[2], t2[3])

  • dim(int,list of int, 可选的) -近似梯度的一个或多个维度。默认情况下,计算每个维度的部分梯度。请注意,当指定dim 时,spacing 参数的元素必须与指定的暗淡对应。”

  • edge_order(int, 可选的) -1 或 2,分别用于边界 (“edge”) 值的 first-ordersecond-order 估计。

使用 second-order accurate central differences method 在一维或多维中估计函数 的梯度。

的梯度是使用样本估计的。默认情况下,当不指定 spacing 时,样本完全由 input 说明,输入坐标到输出的映射与张量索引到值的映射相同。例如,对于三维 input,所说明的函数是

当指定spacing 时,它会修改input 与输入坐标之间的关系。这在下面的“Keyword Arguments” 部分中有详细说明。

通过独立估计 的每个偏导数来估计梯度。如果 中(它至少有 3 个连续导数),这个估计是准确的,并且可以通过提供更接近的样本来改进估计。在数学上,使用 Taylor’s theorem with remainder 估计偏导数的每个内部点的值。让 为内部点, 为与其相邻的点, 处的部分梯度估计使用:

其中 是区间 中的一个数字,并使用 我们得出的事实:

注意

我们以相同的方式估计复域 中函数的梯度。

边界点处的每个偏导数的计算方式不同。请参阅下面的edge_order。

例子:

>>> # Estimates the gradient of f(x)=x^2 at points [-2, -1, 2, 4]
>>> coordinates = (torch.tensor([-2., -1., 1., 4.]),)
>>> values = torch.tensor([4., 1., 1., 16.], )
>>> torch.gradient(values, spacing = coordinates)
(tensor([-3., -2., 2., 5.]),)

>>> # Estimates the gradient of the R^2 -> R function whose samples are
>>> # described by the tensor t. Implicit coordinates are [0, 1] for the outermost
>>> # dimension and [0, 1, 2, 3] for the innermost dimension, and function estimates
>>> # partial derivative for both dimensions.
>>> t = torch.tensor([[1, 2, 4, 8], [10, 20, 40, 80]])
>>> torch.gradient(t)
(tensor([[ 9., 18., 36., 72.],
         [ 9., 18., 36., 72.]]),
 tensor([[ 1.0000, 1.5000, 3.0000, 4.0000],
         [10.0000, 15.0000, 30.0000, 40.0000]]))

>>> # A scalar value for spacing modifies the relationship between tensor indices
>>> # and input coordinates by multiplying the indices to find the
>>> # coordinates. For example, below the indices of the innermost
>>> # 0, 1, 2, 3 translate to coordinates of [0, 2, 4, 6], and the indices of
>>> # the outermost dimension 0, 1 translate to coordinates of [0, 2].
>>> torch.gradient(t, spacing = 2.0) # dim = None (implicitly [0, 1])
(tensor([[ 4.5000, 9.0000, 18.0000, 36.0000],
          [ 4.5000, 9.0000, 18.0000, 36.0000]]),
 tensor([[ 0.5000, 0.7500, 1.5000, 2.0000],
          [ 5.0000, 7.5000, 15.0000, 20.0000]]))
>>> # doubling the spacing between samples halves the estimated partial gradients.

>>>
>>> # Estimates only the partial derivative for dimension 1
>>> torch.gradient(t, dim = 1) # spacing = None (implicitly 1.)
(tensor([[ 1.0000, 1.5000, 3.0000, 4.0000],
         [10.0000, 15.0000, 30.0000, 40.0000]]),)

>>> # When spacing is a list of scalars, the relationship between the tensor
>>> # indices and input coordinates changes based on dimension.
>>> # For example, below, the indices of the innermost dimension 0, 1, 2, 3 translate
>>> # to coordinates of [0, 3, 6, 9], and the indices of the outermost dimension
>>> # 0, 1 translate to coordinates of [0, 2].
>>> torch.gradient(t, spacing = [3., 2.])
(tensor([[ 4.5000, 9.0000, 18.0000, 36.0000],
         [ 4.5000, 9.0000, 18.0000, 36.0000]]),
 tensor([[ 0.3333, 0.5000, 1.0000, 1.3333],
         [ 3.3333, 5.0000, 10.0000, 13.3333]]))

>>> # The following example is a replication of the previous one with explicit
>>> # coordinates.
>>> coords = (torch.tensor([0, 2]), torch.tensor([0, 3, 6, 9]))
>>> torch.gradient(t, spacing = coords)
(tensor([[ 4.5000, 9.0000, 18.0000, 36.0000],
         [ 4.5000, 9.0000, 18.0000, 36.0000]]),
 tensor([[ 0.3333, 0.5000, 1.0000, 1.3333],
         [ 3.3333, 5.0000, 10.0000, 13.3333]]))

相关用法


注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.gradient。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。