Autograd

什么是Autograd?

PyTorch 的 autograd 是一个自动求导库,用于高效地进行反向传播。autograd 能够自动计算神经网络中参数的梯度,从而极大地简化了深度学习模型的训练过程。以下是 autograd 的一些关键概念和功能:

  1. 张量(Tensor)
    在 PyTorch 中,所有操作的基本单元是张量。一个张量类似于 NumPy 的 ndarray,但张量可以在 GPU 上进行加速计算。

  2. requires_grad 属性
    每个张量都有一个 requires_grad 属性,决定是否需要对其进行梯度计算。如果一个张量的 requires_grad=True,那么所有对该张量的操作都会被 autograd 记录下来,以便进行反向传播。

  3. 计算图(Computational Graph)
    autograd 会为每个张量记录其操作历史,这些操作形成一个有向无环图(DAG),图中的节点是张量,边是它们之间的操作。当进行反向传播时,autograd 会根据这个图自动计算所有需要求导的张量的梯度。

  4. 反向传播(Backward)
    调用张量的 backward 方法时,autograd 会自动计算该张量的所有依赖张量的梯度。

示例代码
以下是一个简单的示例,展示了如何使用 autograd 进行自动求导:

python
复制代码
import torch

创建一个张量并设置 requires_grad=True

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

定义一个简单的计算公式 y = x^2

y = x ** 2

计算输出的均值

z = y.mean()

反向传播,计算 z 对 x 的梯度

z.backward()

打印 x 的梯度

print(x.grad) # 输出: tensor([0.6667, 1.3333, 2.0000])
在这个例子中:

x 是一个包含三个元素的张量,并且设置了 requires_grad=True,表示需要计算其梯度。
y 是 x 的平方。
z 是 y 的均值。
调用 z.backward() 进行反向传播,autograd 自动计算 z 对 x 的梯度并存储在 x.grad 中。
应用场景
autograd 是 PyTorch 中自动求导的核心工具,广泛应用于以下场景:

计算神经网络中参数的梯度,用于优化和训练模型。
构建自定义的损失函数,并自动求导。
进行复杂的数学运算,并在反向传播时自动计算梯度。
高级用法
在实际使用中,可能需要更复杂的操作,例如:

禁用梯度计算(例如在推理阶段):使用 with torch.no_grad(): 上下文管理器。
暂停计算图的构建:使用 with torch.enable_grad(): 或 torch.set_grad_enabled(True/False) 上下文管理器。
这些高级功能允许开发者在特定场景下优化性能和内存使用。

autograd 是 PyTorch 的核心组件之一,简化了深度学习模型的开发过程,通过自动计算梯度,使得复杂的模型训练变得更加便捷和高效。

以下是列子

import torch
import warnings
warnings.filterwarnings("ignore")
x=torch.rand(1)
w=torch.rand(1,requires_grad=True)
b=torch.rand(1,requires_grad=True)
y=x*w
z=y+b
x,w,b,y,z
(tensor([0.1459]),
 tensor([0.8698], requires_grad=True),
 tensor([0.8694], requires_grad=True),
 tensor([0.1269], grad_fn=<MulBackward0>),
 tensor([0.9963], grad_fn=<AddBackward0>))
y.grad_fn,z.grad_fn
(<MulBackward0 at 0x23e1f44fa90>, <AddBackward0 at 0x23e1f44f790>)
x.requires_grad,w.requires_grad,b.requires_grad,y.requires_grad,z.requires_grad
(False, True, True, True, True)
#反向传播
z.backward()
#torch.autograd.backward(z,retain_graph=True)
#获取梯度
w.grad,b.grad
#防止梯度累加必须梯度清零
(tensor([0.1459]), tensor([1.]))
x.grad,y.grad,z.grad
(None, None, None)

Autograd的其他函数

torch.autograd.no_grad()

  • torch.autograd.no_grad() 是 PyTorch 中的一个上下文管理器,用于在上下文中禁用自动求导功能。这在推理阶段(即模型评估和预测阶段)特别有用,因为在推理时不需要计算梯度,从而可以节省内存和计算资源。
x=torch.tensor([1.0],requires_grad=True)
y=x*2
print(y.requires_grad)
with torch.autograd.no_grad():
    y=x*2
y.requires_grad
True





False

torch.autograd.enable_grad()

  • torch.autograd.enable_grad() 是 PyTorch 中的一个上下文管理器,用于在其上下文中显式启用梯度计算。这通常与 torch.autograd.no_grad() 搭配使用,以确保在特定代码块中启用或禁用梯度计算。
x=torch.tensor([1.0],requires_grad=True)
y=x*2
with torch.autograd.no_grad():
    with torch.autograd.enable_grad():
        
        y=x*2
y.requires_grad
True

torch.autograd.set_grad_enabled

  • torch.autograd.set_grad_enabled 是 PyTorch 中用于显式启用或禁用梯度计算的上下文管理器。与 torch.autograd.no_grad() 和 torch.autograd.enable_grad() 不同,torch.autograd.set_grad_enabled 允许你根据传入的布尔参数来决定是否启用梯度计算。
x=torch.tensor([1.0],requires_grad=True)
with torch.autograd.set_grad_enabled(True):
    y=x*2
print(y.requires_grad)
with torch.autograd.set_grad_enabled(False):
    y=x*2
print(y.requires_grad)
True
False
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值