PyTorch autograd库: 基于反向模式的自动微分

PyTorch的autograd库的原理主要基于反向模式的自动微分(Reverse Mode Automatic Differentiation),即反向传播。

在PyTorch中对tensor进行操作时,autograd库会在内部为这些操作创建一个计算图(computation graph)。这个计算图记录了从输入到输出的所有计算步骤。需要计算梯度时,autograd库会沿着这个计算图反向传播,从输出开始,逐步计算每个中间变量的梯度,直到达到我们关心的变量(如模型的参数)。

在PyTorch中,每个tensor都有一个requires_grad属性,当这个属性设置为True时,autograd就会开始追踪该tensor上的所有操作。一旦完成了前向计算并得到了一个标量损失值,就可以调用loss.backward()来自动计算梯度。这个过程就是反向传播,它会根据计算图反向地计算每个tensor的梯度,并将结果存储在tensor的.grad属性中。

tensor的requires_grad属性并不是默认的。当创建一个新的tensor时,requires_grad属性默认是False。这意味着,除非明确指定,否则PyTorch不会追踪这个tensor上的操作以用于后续的梯度计算。

创建一个不追踪梯度的tensor:

import torch  
  
# 默认情况下,requires_grad=False  
x = torch.tensor([1.0, 2.0, 3.0])  
print(x.requires_grad)  # 输出:False

如果想让PyTorch追踪这个tensor上的操作以计算梯度,需要在创建tensor时将requires_grad设置为True

# 设置requires_grad=True来追踪梯度  
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)  
print(x.requires_grad)  # 输出:True

如果已经有一个设置了requires_grad=True的tensor,但想在某个操作中停止追踪,可以使用torch.no_grad()上下文管理器

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)  
  
# 在此上下文内,不会追踪梯度  
with torch.no_grad():  
    y = x * 2  # 这里对y的操作不会被追踪,因此y.requires_grad将是False  
  
print(y.requires_grad)  # 输出:False

使用torch.no_grad()可以在评估模型、加载预训练权重或执行其他不需要梯度追踪的操作时提高效率。同时,它也可以防止在不需要时意外地创建计算图,从而节省内存和计算资源。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值