我是 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/