PyTorch中的running loss是什么,它如何计算?

19
我看了一下PyTorch文档中关于迁移学习的这篇教程。有一行代码我没有理解清楚。
在使用loss = criterion(outputs, labels)计算损失之后,使用running_loss += loss.item() * inputs.size(0)计算运行损失值,最终使用running_loss / dataset_sizes[phase]计算出该轮训练的损失值。
我的疑问是:loss.item()不是应该用于整个mini-batch才对吗?也就是说,如果batch_size是4,那么loss.item()应该给出整个4张图片的损失值。如果是这样,为什么在计算running_loss时要将loss.item()inputs.size(0)相乘呢?这一步骤不是多余的吗?
感谢任何帮助。谢谢!
2个回答

30

这是因为CrossEntropy或其他损失函数给出的损失是按元素数量进行划分的,即默认情况下缩减参数为mean

torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

因此,loss.item() 包含整个小批量的损失,但是除以了批次大小。这就是为什么在计算 running_loss 时,loss.item() 乘以批次大小,即由 inputs.size(0) 给出的原因。请保留{{和}}占位符。

9
如果batch_size为4,则loss.item()将给出整个4张图片集的损失。
这取决于如何计算loss。请记住,loss与其他张量一样也是一个张量。通常情况下,PyTorch API默认返回平均损失。
"The losses are averaged across observations for each minibatch."
对于张量t,t.item()仅将其转换为Python的默认float32类型。更重要的是,如果您是PyTorch的新手,了解我们使用t.item()来维护运行中的损失而不是t可能会有所帮助,因为PyTorch张量会存储其值的历史记录,这可能很快会过载您的GPU。

"PyTorch张量存储其值的历史记录,这可能会很快超载您的GPU。所以,您是说t在GPU内存中,而t.item()在CPU内存中,对吗?如果我错了,您能简要解释一下吗?" - Aditya Wagh
1
t.item() 会获取存储在 CPU 上的损失值(作为浮点数),但重点是 t 包含前述的损失值和梯度,后者仅与反向传播相关,因此在计算/存储运行损失时不应保留。因此,无论您使用 CPU 还是 GPU,这都是相关的。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接