栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

PyTorch-1.10(十二)--torch.autograd基本用法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyTorch-1.10(十二)--torch.autograd基本用法

Torch.autograd

torch.autograd 提供实现任意标量值函数自动微分的类和函数。只需要对现有代码进行最小的更改(声明张量,设置使用requires_grad=True关键字计算其梯度). 到目前为止,pytorch只支持浮点张量类型 ( half, float, double and bfloat16) 和复数张量类型 (cfloat, cdouble)的autograd。

backward

计算给定张量相对于图叶节点的梯度之和。

grad

计算并返回输出相对于输入的梯度之和。
局部启用、禁用梯度计算

在torch部分已经进行了介绍,详情看这篇文章。

no_grad

上下文管理器禁用梯度计算.

enable_grad

上下文管理器启用梯度计算.

set_grad_enabled

上下文管理器将“梯度计算”设置为“开”或“关”。

inference_mode

上下文管理器启用或禁用推理模式
默认梯度布局

当非稀疏参数在 torch.autograd.backward() or torch.Tensor.backward() 过程中接受一个非稀疏梯度时,param.grad累积如下.

如果param.grad 初始化值为None:

  • 1. 如果param的存储不重叠且密集, .grad 是以param步幅匹配的方式创建的 (因此匹配的是 param的layout布局).

  • 2. 否则, .grad 是用连续的行创造的.

如果param已经有一个非稀疏的.grad属性值:

  • 3. 如果create_graph=False, backward() 原位累加到 .grad, 同时保持步幅不变.

  • 4. 如果create_graph=True, backward() 用一个新的张量值.grad + new grad 替换 .grad, 试图(但不保证)与先前存在的.grad步幅匹配.

建议使用默认行为(使.grads在第一个backward()之前为None,这样它们的布局根据1或2创建,并根据3或4随时间保留),以获得最佳性能。 调用model.zero_grad()或optimizer.zero_grad()不会影响.grad的layout布局。

事实上,在每个累积计算之前重置所有.grad的值为None, e.g.:

for iterations...
    ...
    for param in model.parameters():
        param.grad = None
    loss.backward()

这样每次都会根据1或2重新创建它们,这是model.zero_grad()或optimizer.zero_grad()的有效替代方案,这可能会提高某些网络的性能。

手动梯度布局

如果你需要手动控制.grad的步幅,指定param.grad为在第一次backward()之前具有所需步幅的归零张量,不将其重置为None。

3.只要create_graph=False,就可以保证布局得到保留。

4. 当create_graph=True时,布局也可能保留。

变量Variable (被弃用)

WARNING

变量API已被弃用:变量不再需要与张量一起使用autograd. Autograd自动支持带有requires_grad=True的张量. 

  • Variable(tensor) 和 Variable(tensor, requires_grad) 仍按预期工作,但它们返回的是张量而不是变量。

  • var.data和tensor.data是一样的。

  • var.backward(), var.detach(), var.register_hook() 方法现在可以通过张量函数名操作如tensor.backward(), tensor.detach(), tensor.register_hook().

现在可以直接创建requires_grad=True的张量, 例如torch.randn(), torch.zeros(), torch.ones()

autograd_tensor = torch.randn((2, 3, 4), requires_grad=True)
张量autograd函数

torch.Tensor.grad

这个属性值默认为None,第一次使用backward()后变成一个张量.

torch.Tensor.requires_grad

如果需要为此张量计算梯度,则为True, False 则不计算.

torch.Tensor.is_leaf

按惯例,所有具有requires_grad=False的张量都将是叶张量。

torch.Tensor.backward([gradient, …])

计算当前张量的梯度。

torch.Tensor.detach

返回一个与当前图形分离的新张量。

torch.Tensor.detach_

将张量从创建它的图形中分离,使其成为一片叶子。

torch.Tensor.register_hook(hook)

注册一个backward的钩子。

torch.Tensor.retain_grad()

使得张量在 backward()过程中保留值

梯度函数Function

CLASStorch.autograd.Function(*args**kwargs)[SOURCE]

用户自定义autograd.Function的基类

为了创建用户自定义的autograd.Function, 需要继承该类并且实现 forward() 和backward的静态类方法。然后,调用类函数apply来利用自定义op实现前向传播,不要直接调用forward()函数。

示例:

>>> class Exp(Function):
>>>     @staticmethod
>>>     def forward(ctx, i):
>>>         result = i.exp()
>>>         ctx.save_for_backward(result)
>>>         return result
>>>
>>>     @staticmethod
>>>     def backward(ctx, grad_output):
>>>         result, = ctx.saved_tensors
>>>         return grad_output * result
>>>
>>> # Use it by calling the apply method:
>>> output = Exp.apply(input)

Function.backward

定义一个公式,用于使用向后模式自动微分来区分操作。

Function.forward

执行操作。
数值梯度检查

gradcheck

依照分析梯度来检查通过小的有限差分计算得到的梯度。

gradgradcheck

依照分析梯度来检查通过小的有限差分计算的梯度的梯度

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号