pytorch训练预测常用语句

在PyTorch中,每个批量(batch)训练时,需要通过optimizer.zero_grad()重置梯度,然后通过loss.backward()计算梯度,最后optimizer.step()更新参数。这是因为梯度是累加的,避免不同batch间的梯度混合。在预测阶段,使用torch.no_grad()防止构建计算图,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个batch必定执行的操作步骤

optimizer.zero_grad() # 梯度初始化为零,把loss关于weight的导数变成0
output = model(data) # forward:将数据传入模型,前向传播求出预测的值
loss = F.cross_entropy(output, target) # 求loss
loss.backward() # backward:反向传播求梯度
optimizer.step() # optimizer:更新所有参数

三个函数的作用是先将梯度归零optimizer.zero_grad(),然后反向传播计算得到每个参数的梯度值loss.backward(),最后通过梯度下降执行一步参数更新optimizer.step()

step()函数的作用是执行一次优化步骤,通过梯度下降法来更新参数的值。因为梯度下降是基于梯度的,所以在执行optimizer.step()函数前应先执行loss.backward()函数来计算梯度。

注意:optimizer只负责通过梯度下降进行优化,而不负责产生梯度,梯度是loss.backward()方法产生的。

为什么每一轮batch都需要设置optimizer.zero_grad

根据pytorch中的backward()函数的计算,当网络参量进行反馈时,梯度是被积累的而不是被替换掉

但是在每一个batch时毫无疑问并不需要将两个batch的梯度混合起来累积,因此这里就需要每个batch设置一遍zero_grad。

预测时为什么用 with torch.no_grad()

with是python中上下文管理器,简单理解,当要进行固定的进入,返回操作时,可以将对应需要的操作,放在with所需要的语句中。比如文件的写入(需要打开关闭文件)等。

在使用pytorch时,并不是所有的操作都需要进行计算图的生成(计算过程的构建,以便梯度反向传播等操作)。而对于tensor的计算操作,默认是要进行计算图的构建的,使用 with torch.no_grad():是强制之后的内容不进行计算图构建。主要用在预测阶段,因为一般是一边训练一边预测,预测的时候不能对图产生影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值