分类目录:《深入浅出Pytorch函数》总目录
相关文章:
· 深入浅出Pytorch函数——torch.Tensor
计算当前张量相对于图的梯度,该函数使用链式法则对图进行微分。如果张量不是一个标量(即其数据具有多个元素)并且需要梯度,则函数还需要指定梯度,指定的梯度应该是一个与当前张量类型和形状匹配的张量,包含微分函数的梯度。此函数在累积了图中各叶子结点的梯度,在调用它之前,我们可能需要将grad
属性置零或将其设置为None
。
语法
Tensor.backward(gradient=None, retain_graph=None, create_graph=False, inputs=None)
参数
-
gradient
:[Tensor
/None
] 相对张量的梯度。如果它是张量,它将自动转换为不需要grad
的张量,除非create_graph
为True
。对于标量或不需要梯度的张量应指定为None
。 -
retain_graph
:[可选,bool
] 如果为False
,则用于计算梯度的图将被释放。请注意,在几乎所有情况下,都不需要将此选项设置为True
,而且通常可以以更有效的方式解决。默认为create_graph
的值。 -
create_graph
:[可选,bool
] 如果为True
,将构建导数的图,从而可以计算更高阶的导数乘积,默认值为False
。 -
inputs
:[List[Tensor]
] 输入张量的梯度将累积为.grad
。所有其他张量都将被忽略。如果没有提供,梯度将累积到用于计算的所有叶张量中。
参数详解
retain_graph
Pytorch是动态图计算机制,在每一次反向传播计算梯度的循环内,Pytorch先建立正向计算图,然后使用反向传播计算梯度,同时被销毁计算图,下一次循环时再重新建立正向计算图。他的官方定义为:
retain_graph (bool, optional)
:If False, the graph used to compute the grad will be freed. Note that in nearly all cases setting this option to True is not needed and often can be worked around in a much more efficient way. Defaults to the value of create_graph.
例如下面的代码:文章来源:https://www.toymoban.com/news/detail-611497.html
import torch import torch.nn as nn
class Function(torch.nn.Module):
def __init__(self):
super(Function, self).__init__()
self.Linear = torch.nn.Linear(1,1)
def forward(self, input):
output = self.Linear(input)
return output
func = Function()
x= torch.tensor([1.0]) x.requires_grad=True y = func(x) ** 2
y.backward(retain_graph=True)
y.backward()
从第一行至倒数第三行,Pytorch依据代码建立了正向计算图,若倒数第二行改为y.backward()
,则在第一次反向传播后,正向计算图会被销毁,但是我们使用了retain_graph=True
保持正向计算图不被销毁,故倒数第一行y.backward()
可以进行第二次反向传播。否则,在默认情况retain_graph=Flase
下会报错:文章来源地址https://www.toymoban.com/news/detail-611497.html
Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.
到了这里,关于深入浅出Pytorch函数——torch.Tensor.backward的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!