使用 mini-batch 时累积的 pytorch 损失

标签 pytorch loss-function mini-batch

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

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

最佳答案

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

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

注意:如果您在优化循环之外使用 PyTorch 变量,例如在不同的范围内,如果您调用诸如 return loss 之类的内容,则可能会发生这种情况,因此对计算过程中的任何 PyTorch 变量调用 .item() 至关重要图(作为一般经验法则,与 PyTorch 方法交互的任何输出/损失/模型都可能是计算图的一部分)。如果不是,这可能会导致计算图无法从 Python 内存中取消分配/删除,并可能导致 CPU/GPU 内存泄漏。不过,您上面的内容看起来是正确的!

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

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

关于使用 mini-batch 时累积的 pytorch 损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66726886/

相关文章:

pytorch - 使用 pytorch Lightning 在回调中访问纪元结束时的所有批处理输出

torch 1.7.0 | DataLoader 错误 - TypeError : 'module' object is not callable

python - 查找张量中沿轴的非零元素数

keras - Keras 中的自定义损失函数(焦点损失)输入大小错误

memory - xarray.Dataset.to_array() 是否将数组加载到内存中以及如何有效地从 xarray 中采样小批量?

python-2.7 - Linux CentOS 7上的CMake,如何强制系统使用cmake3?

tensorflow - 平均绝对相对误差作为 tensorflow 中的损失函数(回归问题)

python - 在keras损失函数中使用tensorflow.py_func

python-3.x - 用于各种维度输入的高效 PyTorch DataLoader collat​​e_fn 函数

python - Tensorflow:小批量中每个样本的不同过滤器的卷积