torch.gradient#
- torch.gradient(input,*,spacing=1,dim=None,edge_order=1)→ListofTensors#
Estimates the gradient of a function inone or more dimensions using thesecond-order accurate central differences method andeither first or second order estimates at the boundaries.
The gradient of is estimated using samples. By default, when
spacingis notspecified, the samples are entirely described byinput, and the mapping of input coordinatesto an output is the same as the tensor’s mapping of indices to values. For example, for a three-dimensionalinputthe function described is, and.When
spacingis specified, it modifies the relationship betweeninputand input coordinates.This is detailed in the “Keyword Arguments” section below.The gradient is estimated by estimating each partial derivative of independently. This estimation isaccurate if is in (it has at least 3 continuous derivatives), and the estimation can beimproved by providing closer samples. Mathematically, the value at each interior point of a partial derivativeis estimated usingTaylor’s theorem with remainder.Letting be an interior point with and be points neighboringit to the left and right respectively, and can be estimated using:
Using the fact that and solving the linear system, we derive:
Note
We estimate the gradient of functions in complex domain in the same way.
The value of each partial derivative at the boundary points is computed differently. See edge_order below.
- Parameters
input (
Tensor) – the tensor that represents the values of the function- Keyword Arguments
spacing (
scalar,listofscalar,listofTensor, optional) –spacingcan be used to modifyhow theinputtensor’s indices relate to sample coordinates. Ifspacingis a scalar thenthe indices are multiplied by the scalar to produce the coordinates. For example, ifspacing=2theindices (1, 2, 3) become coordinates (2, 4, 6). Ifspacingis a list of scalars then the correspondingindices are multiplied. For example, ifspacing=(2,-1,3)the indices (1, 2, 3) become coordinates (2, -2, 9).Finally, ifspacingis a list of one-dimensional tensors then each tensor specifies the coordinates forthe corresponding dimension. For example, if the indices are (1, 2, 3) and the tensors are (t0, t1, t2), thenthe coordinates are (t0[1], t1[2], t2[3])dim (
int,listofint, optional) – the dimension or dimensions to approximate the gradient over. By defaultthe partial gradient in every dimension is computed. Note that whendimis specified the elements ofthespacingargument must correspond with the specified dims.”edge_order (
int, optional) – 1 or 2, forfirst-order orsecond-orderestimation of the boundary (“edge”) values, respectively. Note that whenedge_orderis specified, eachdimension size ofinputshould be at least edge_order+1
Examples:
>>># 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]]))