Pytorch中的机器学习步骤

egmofgnx  于 2022-12-04  发布在  其他
关注(0)|答案(4)|浏览(146)

当我们在PyTorch中定义我们的模型时。我们运行不同的#epochs。我想知道在epochs的迭代中。下面两个顺序不同的代码片段之间有什么区别?这两个片段版本是:
1.我在教程中找到
1.我的主管为项目提供的代码。
教程版本

for i in range(epochs):
    logits = model(x)    
    loss = loss_fcn(logits,lables)
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

主管版本

for i in range(epochs):
    logits = model(x)
    loss = loss_fcn(logits,lables)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
x7rlezfr

x7rlezfr1#

唯一的区别是清除渐变的时间。(调用optimizer.zero_grad时())第一个版本在更新权重后将梯度归零(optimizer.step()),第二个迭代在更新权重后将梯度清零。两个版本都应该运行良好。唯一的区别是第一个迭代,其中第二个片段更好,因为它确保在计算梯度之前剩余梯度为零。

ajsxfq5m

ajsxfq5m2#

在PyTorch中,我们通常希望在开始反向传播(即更新权重和偏差)之前的训练阶段将每个小批处理的梯度显式设置为零,因为PyTorch会在后续的反向传递中累积梯度。关于您的问题,两个代码段的做法是相同的,重要的细节是在loss.backward()之前调用optimizer.zero_grad()

wfauudbj

wfauudbj3#

下面是迭代的伪代码:
1.运行模型
1.计算机损耗
〈--这里是零梯度......
1.后退(如果没有梯度累积,则计算梯度)
1.更新权重
〈--...或者这里
基本上你在后退和更新权重之前或之后将梯度归零。这两个代码片段都是可以的。

rm5edbpk

rm5edbpk4#

这两个代码片段的主要区别在于优化器的zero_grad()和step()方法的调用顺序。
在教程版本中,优化器的zero_grad()方法在loss.backward()方法之前调用,而在管理器版本中,优化器的zero_grad()方法在loss.backward()方法之后调用。
zero_grad的阶数差()和步骤()调用可能会影响模型的性能。在教程版本中,优化程序的梯度将在向后传递之前重置为零,这可以防止梯度累积并可能导致数值不稳定。在管理程序版本中,优化程序的梯度将在向后传递之后重置为零。这可能允许梯度累积并潜在地导致数值不稳定性。
通常建议在向后传递之前调用优化器的zero_grad()方法,因为这有助于防止数值不稳定性并提高模型的性能。然而,调用这些方法的确切顺序可能取决于模型的具体细节和所使用的优化算法。

相关问题