什么是 loss_cls 和 loss_bbox 以及为什么它们在训练中总是为零

Posted

技术标签:

【中文标题】什么是 loss_cls 和 loss_bbox 以及为什么它们在训练中总是为零【英文标题】:What is loss_cls and loss_bbox and why are they always zero in training 【发布时间】:2019-07-25 09:58:14 【问题描述】:

我正在尝试使用 Detectron here 的 Pytorch 实现来训练使用 faster_rcnn 的自定义数据集。我已根据 repo 中的指南对数据集和配置进行了更改。

训练过程成功进行,但loss_clsloss_bbox的值从一开始就为0,即使训练完成,最终输出也不能用于评估或推断。 我想知道这两个是什么意思,以及如何在培训期间改变这些价值观。我在这里使用的确切模型是e2e_faster_rcnn_R-50-FPN_1x

对此的任何帮助将不胜感激。我在 Anaconda、CUDA 9、cuDNN 7 上使用 Ubuntu 16.04 和 Python 3.6。

【问题讨论】:

【参考方案1】:

这两个损失是什么?

在训练多目标检测器时,您通常有(至少)两种类型的损失:

    loss_bbox:衡量预测边界框与地面实况对象“紧密”程度的损失(通常是回归损失,L1smoothL1 等)。 loss_cls:衡量每个预测边界框分类正确性的损失:每个框可能包含一个对象类或“背景”。这种损失通常称为交叉熵损失。

为什么损失总是零?

在训练检测器时,模型会为每张图像预测相当多 (~1K) 个可能的框。它们中的大多数是空的(即属于“背景”类)。损失函数将每个预测框与图像的真实框标注相关联。

如果预测框与地面实况框有显着重叠,则计算 loss_bboxloss_cls 以查看模型预测地面实况框的能力。

另一方面,如果预测框与任何真实框不重叠,则“背景”类仅计算 loss_cls。 然而,如果只有非常部分的与地面实况重叠,则预测框被“丢弃”并且不计算损失。我怀疑,出于某种原因,您的培训课程就是这种情况。

我建议您检查确定预测的盒装注释和地面实况注释之间关联的参数。此外,查看“锚点”的参数:这些参数决定了预测框的比例和纵横比。

【讨论】:

感谢您的快速回复。就我而言,数据集的数据很少,只有 3 个类,并且没有 __background__ 类。这个 Pytorch 实现非常复杂,我很难弄清楚如何调整与锚框和地面实况关联相关的参数。 @RakihthaRR 你应该有背景课程。 哦,我明白了。哪些对象应该属于背景类?反正我的课程在 COCO 中是没有的。 @RakihthaRR 背景是预测框,不涵盖任何其他类

以上是关于什么是 loss_cls 和 loss_bbox 以及为什么它们在训练中总是为零的主要内容,如果未能解决你的问题,请参考以下文章

什么是jwks?刷新和访问令牌的 jwks 到底是什么?

什么是类?类与对象的区别是什么?

什么叫基本表?什么是视图?二者的区别和联系是什么?

什么是cookie?什么是session?session和cookie有什么区别?

什么是类?什么是对象?类和对象有什么关系?

为什么和什么是 DevOps?