當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。