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=Falsebackward() 原位累加到 .grad, 同时保持步幅不变.

  • 4. 如果create_graph=Truebackward() 用一个新的张量值.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.datatensor.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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值