> 文章列表 > pytorch训练预测常用语句

pytorch训练预测常用语句

pytorch训练预测常用语句

每个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():是强制之后的内容不进行计算图构建。主要用在预测阶段,因为一般是一边训练一边预测,预测的时候不能对图产生影响。