2

我是pytorch的新手。请问添加'loss.item()'有什么区别?以下2部分代码:

for epoch in range(epochs):
    trainingloss =0
    for i in range(0,X.size()[1], batch_size):
        indices = permutation[i:i+batch_size]
        F = model.forward(X[n])
        optimizer.zero_grad()
        criterion = loss(X,n)
        criterion.backward()
        optimizer.step()
        trainingloss += criterion.item()

还有这个

for epoch in range(epochs):
    for i in range(0,X.size()[1], batch_size):
        indices = permutation[i:i+batch_size]
        F = model.forward(X[n])
        optimizer.zero_grad()
        criterion = loss(X,n)
        criterion.backward()
        optimizer.step()

如果有人有任何想法,请提供帮助。非常感谢你。

4

2 回答 2

1

调用loss.item()允许您获取一个loss与 PyTorch 创建的计算图分离的变量(这就是.item()PyTorch 变量的作用)。

如果您trainingloss += criterion.item()在每个“批量循环”的末尾添加该行,这将通过增量添加训练集中每个小批量的损失来跟踪整个迭代过程中的批量损失。这是必要的,因为您使用的是小批量 - 每个小批量的损失将不等于所有批次的损失。

注意:如果您在优化循环之外使用return lossPyTorch变量,例如在不同的范围内,如果您调用类似.item()拇指,任何与 PyTorch 方法交互的输出/损失/模型都可能成为您计算图的一部分)。如果没有,这可能会导致计算图无法从 Python 内存中取消分配/删除,并可能导致 CPU/GPU 内存泄漏。不过,您上面的内容看起来是正确的!

此外,在未来,PyTorch 的DataLoader课程可以帮助您使用更少样板代码的小批量 - 它可以循环您的数据集,这样您循环的每个项目都是一个训练批次 - 即您在优化中不需要两个 for 循环。

我希望你喜欢学习/使用 PyTorch!

于 2021-03-20T22:16:54.997 回答
1

在您的训练循环中,该criterion.backward()部分计算前馈路径的每个可训练参数的梯度,然后该optimizer.step()部分根据计算的梯度和优化技术更新参数。因此,在这一步结束时,特定批次的模型训练已经完成,该trainingloss += criterion.item()部分仅用于跟踪和监控训练过程以及每一步训练的损失值。

于 2021-03-20T22:21:56.123 回答