Spec-Zone.ru › PyTorch 2.14

torch.gradient

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

Оценивает градиент функции g:Rn→Rg : \mathbb{R}^n \rightarrow \mathbb{R} в одном или нескольких измерениях с помощью метода центральных разностей второго порядка точности и оценок первого или второго порядка на границах.

Градиент gg оценивается по выборкам. По умолчанию, если spacing не указан, выборки полностью задаются с помощью input, а соответствие входных координат выходным значениям совпадает с соответствием индексов тензора значениям. Например, для трехмерного input описывается функция g:R3→Rg : \mathbb{R}^3 \rightarrow \mathbb{R}, и g(1,2,3)==input[1,2,3]g(1, 2, 3)\ == input[1, 2, 3].

Если указать spacing, оно изменяет связь между input и входными координатами. Подробнее об этом см. в разделе «Именованные аргументы» ниже.

Градиент оценивается путем независимого вычисления каждой частной производной функции gg. Эта оценка точна, если функция gg принадлежит классу C3C^3 (имеет как минимум три непрерывные производные), а точность оценки можно повысить, используя более близкие выборки. Математически значение частной производной в каждой внутренней точке оценивается с помощью теоремы Тейлора с остаточным членом. Пусть xx — внутренняя точка, а x−hlx-h_l и x+hrx+h_r — соседние с ней точки слева и справа соответственно. Значения f(x+hr)f(x+h_r) и f(x−hl)f(x-h_l) можно оценить следующим образом:

f(x+hr)=f(x)+hrf′(x)+hr2f′′(x)2+hr3f′′′(ξ1)6,ξ1∈(x,x+hr)f(x−hl)=f(x)−hlf′(x)+hl2f′′(x)2−hl3f′′′(ξ2)6,ξ2∈(x,x−hl)\begin{aligned} f(x+h_r) = f(x) + h_r f'(x) + {h_r}^2 \frac{f''(x)}{2} + {h_r}^3 \frac{f'''(\xi_1)}{6}, \xi_1 \in (x, x+h_r) \\ f(x-h_l) = f(x) - h_l f'(x) + {h_l}^2 \frac{f''(x)}{2} - {h_l}^3 \frac{f'''(\xi_2)}{6}, \xi_2 \in (x, x-h_l) \\ \end{aligned}

Используя тот факт, что f∈C3f \in C^3, и решая систему линейных уравнений, получаем:

f′(x)≈hl2f(x+hr)−hr2f(x−hl)+(hr2−hl2)f(x)hrhl2+hr2hlf'(x) \approx \frac{ {h_l}^2 f(x+h_r) - {h_r}^2 f(x-h_l) + ({h_r}^2-{h_l}^2 ) f(x) }{ {h_r} {h_l}^2 + {h_r}^2 {h_l} }

Примечание

Мы аналогичным образом оцениваем градиент функций в комплексной области g:Cn→Cg : \mathbb{C}^n \rightarrow \mathbb{C}.

Значение каждой частной производной в граничных точках вычисляется иначе. См. описание 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 должны соответствовать указанным измерениям.»
  • edge_order (int, необязательно) – 1 или 2 для оценки граничных («краевых») значений первого порядка или второго порядка соответственно. Обратите внимание: если указано edge_order, размер каждого измерения input должен быть не меньше edge_order+1

Примеры:

>>> # 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]]))

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.gradient.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API