torch.gradient¶
- torch.gradient(input, *, spacing=1, dim=None, edge_order=1) 张量列表 ¶
使用二阶精确中心差分法以及边界处的一阶或二阶估计,估计函数在一个或多个维度上的梯度。
使用样本估计的梯度。默认情况下,当未指定
spacing
时,样本完全由input
描述,并且输入坐标到输出的映射与张量索引到值的映射相同。例如,对于一个三维input
,所描述的函数为,并且.当指定
spacing
时,它会修改input
和输入坐标之间的关系。这在下面的“关键字参数”部分中有详细说明。梯度的估计是通过独立估计的每个偏导数来完成的。如果属于(至少具有3阶连续导数),则这种估计是准确的,并且可以通过提供更接近的样本值来改进估计。在数学上,偏导数在每个内点处的取值是使用带有余项的泰勒定理进行估计的。令为一个内点,和分别为其左右两侧的相邻点,则可以使用以下方法估计和。
利用这一事实并求解线性方程组,我们可以得到
注意
我们以相同的方式估计复数域中函数的梯度。
边界点的每个偏导数值的计算方式不同。请参见下面的 `edge_order`。
- 参数
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
参数的元素必须与指定的维度相对应。”
示例
>>> # 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]]))