使用小批量时累积的 pytorch 损失

pytorch loss accumulated when using mini-batch

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

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()

如果有人有任何想法请帮忙。非常感谢。

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

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

注意:如果您在优化循环之外使用 PyTorch 变量,例如在不同的范围内,如果您调用 return loss 之类的东西可能会发生这种情况,请务必对作为计算图一部分的任何 PyTorch 变量调用 .item()(作为一般经验法则,任何outputs/loss/models 与 PyTorch 方法交互的可能是您的计算图的一部分)。否则,这可能导致计算图不是来自 Python 内存的 de-allocated/deleted,并可能导致 CPU/GPU 内存泄漏。不过你上面的内容看起来是正确的!

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

希望你喜欢learning/using PyTorch!

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