torch.autograd
提供了类和函数用来对任意标量函数进行求导。要想使用自动求导,只需要对已有的代码进行微小的改变。只需要将所有的tensor
包含进Variable
对象中即可。
计算给定变量 wrt 图叶的梯度的总和。 该图使用链规则进行区分。如果任何 variables 非标量(即它们的数据具有多个元素)并且需要梯度,则该函数另外需要指定 grad_variables。它应该是一个匹配长度的序列,其包含差分函数 wrt 对应变量的渐变(None 对于不需要梯度张量的所有变量,它是可接受的值)。
此函数在树叶中累加梯度 - 在调用它之前可能需要将其清零。
参数:
variables (variable 列表) – 将计算导数的变量 。
grad_variables (序列(Tensor
, Variable
或者 None
)) – 渐变写入相应变量的每个元素。任何张量将被自动转换为 volatile,除非 create_graph 为 True。可以为标量变量或不需要 grad 的值指定无值。如果所有 grad_variables 都可以接受 None 值,则该参数是可选的。
retain_graph(bool,可选) - 如果为 False,则用于计算 grad 的图形将被释放。请注意,在几乎所有情况下,将此选项设置为 True 不是必需的,通常可以以更有效的方式解决。默认值为 create_graph。
create_graph(bool,可选) - 如果为 true,则构造导数的图形,允许计算更高阶的衍生产品。默认为 False,除非 grad_variables 包含至少一个非易失性变量。
计算并返回输入的输出梯度的总和。
gradoutputs 应该是 output 包含每个输出的预先计算的梯度的长度匹配序列。如果输出不需要 grad,则渐变可以是 None)。当不需要派生图的图形时,梯度可以作为 Tensors 给出,或者作为 Variables,在这种情况下将创建图形。
如果 only_inputs 为 True,该函数将仅返回指定输入的渐变列表。如果它是 False,则仍然计算所有剩余叶子的渐变度,并将累积到其.grad 属性中。
参数:
可变 API 与常规 Tensor API(除了几个就地方法,覆盖渐变计算所需的输入之外)几乎相同。在大多数情况下,传感器可以安全地替换为变量,代码将保持工作正常。因此,我们不会记录变量的所有操作,torch.Tensor 为此也应该参考文档。
支持自动归档中的就地操作是一件很困难的事情,我们在大多数情况下都不鼓励使用它们。Autograd 的积极缓冲区释放和重用使其非常高效,并且在现场操作实际上会降低内存使用量的情况下,极少数场合很少。除非您在内存压力很大的情况下运行,否则您可能永远不需要使用它们。
所有 Variable 的跟踪应用于它们的就地操作,并且如果实现检测到在一个功能中保存了向后的变量,但是之后被修改就位,则一旦向后通过开始就会产生错误。这可以确保如果您使用就地功能并且没有看到任何错误,则可以确定计算出的渐变是正确的。
包裹张量并记录应用的操作。
变量是 Tensor 对象周围的薄包装,它也保存了渐变 wrt,并引用了创建它的函数。此引用允许回溯创建数据的整个操作链。如果变量是由用户创建的,那么它的 grad_fn 将被 None 我们称为这样的对象叶变量。
由于自动调整仅支持标量值函数微分,因此 grad 大小始终与数据大小匹配。此外,grad 通常仅分配给叶变量,否则将始终为零。
变量:
data – 包含的Tensor
grad - 变量保持类型和位置的坡度匹配.data。此属性是懒惰分配的,无法重新分配。
requires_grad - 指示变量是否由包含任何需要的变量的子图创建的布尔值。有关详细信息,请参阅从向后排除子图。只能在叶变量上更改。
volatile - Boolean 表示在推断模式下应该使用 Variable,即不保存历史记录。有关详细信息,请参阅 从向后排除子图。只能在叶变量上更改。
is_leaf - Boolean 指示变量是否为图形叶(即如果由用户创建)。
grad_fn - 梯度函数图跟踪。
属性:
data (any tensor class) – 被包含的Tensor
requires_grad (bool) – requires_grad
标记. 只能通过keyword
传入.
volatile (bool) – volatile
标记. 只能通过keyword
传入.
当前Variable
对leaf variable
求偏导。
计算图可以通过链式法则求导。如果Variable
是 非标量(non-scalar
)的,且requires_grad=True
。那么此函数需要指定gradient
,它的形状应该和Variable
的长度匹配,里面保存了Variable
的梯度。
此函数累积leaf variable
的梯度。你可能需要在调用此函数之前将Variable
的梯度置零。
参数:
返回一个新变量,与当前图形分离。
结果将永远不需要渐变。如果输入是易失的,输出也将变得不稳定。
注意: 返回变量使用与原始变量相同的数据张量,并且可以看到其中任何一个的就地修改,并且可能会触发正确性检查中的错误。
从创建它的图形中分离变量,使其成为叶。
注册一个backward
钩子。
每次gradients
被计算的时候,这个hook
都被调用。hook
应该拥有以下签名:
hook(grad) -> Variable or None
钩子不应该修改它的参数,但是它可以选择返回一个新的渐变,用来代替它 grad。
此函数返回一个带有 handle.remove() 从模块中删除钩子的方法的句柄。
例:
>>> v = Variable(torch.Tensor([0, 0, 0]), requires_grad=True)
>>> h = v.register_hook(lambda grad: grad * 2) # double the gradient
>>> v.backward(torch.Tensor([1, 1, 1]))
>>> v.grad.data
2
2
2
[torch.FloatTensor of size 3]
>>> h.remove() # removes the hook
注册一个奖励,这个奖励是由一个随机过程得到的。
微分一个随机节点需要提供一个奖励值。如果你的计算图中包含随机 operations
,你需要在他们的输出上调用这个函数。否则的话,会报错。
参数:
Varaible
形状相同,并在同一个设备上。启用非叶变量的.grad 属性。
记录操作历史并定义用于区分操作的公式。
在 Variables 上执行的每个操作创建一个新的函数对象,执行计算,并记录它发生的情况。历史以 DAG 的形式保留,边缘表示数据依赖()。然后,当调用向后时,通过调用每个对象的方法,并将返回的梯度传递给下一个 s 来处理图形的拓扑排序 。input <- outputbackward()FunctionFunction
通常,用户与功能交互的唯一方式是创建子类并定义新的操作。这是延长 torch.autograd 的推荐方法。
由于函数逻辑是大多数脚本的热点,因此几乎所有脚本都被移动到 C 后端,以确保框架开销最小化。
每个功能仅用于一次(在正向通行证中)。
变量:
定义用于区分操作的公式。
此功能将被所有子类覆盖。
所有参数都是张量。它必须接受完全一样多的论据,因为许多输出都 forward()返回,它应该返回尽可能多的张量,因为有输入 forward()。每个参数是给定输出的渐变 wrt,每个返回的值应该是对应输入的渐变。
执行操作。
此功能将被所有子类覆盖。
它可以采取并返回任意数量的张量。
用户名 | 头像 | 职能 | 签名 |
---|---|---|---|
Song | 翻译 | 人生总要追求点什么 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。