什么是 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_cls
和loss_bbox
的值从一开始就为0,即使训练完成,最终输出也不能用于评估或推断。
我想知道这两个是什么意思,以及如何在培训期间改变这些价值观。我在这里使用的确切模型是e2e_faster_rcnn_R-50-FPN_1x
对此的任何帮助将不胜感激。我在 Anaconda、CUDA 9、cuDNN 7 上使用 Ubuntu 16.04 和 Python 3.6。
【问题讨论】:
【参考方案1】:这两个损失是什么?
在训练多目标检测器时,您通常有(至少)两种类型的损失:
loss_bbox
:衡量预测边界框与地面实况对象“紧密”程度的损失(通常是回归损失,L1
、smoothL1
等)。
loss_cls
:衡量每个预测边界框分类正确性的损失:每个框可能包含一个对象类或“背景”。这种损失通常称为交叉熵损失。
为什么损失总是零?
在训练检测器时,模型会为每张图像预测相当多 (~1K) 个可能的框。它们中的大多数是空的(即属于“背景”类)。损失函数将每个预测框与图像的真实框标注相关联。
如果预测框与地面实况框有显着重叠,则计算 loss_bbox
和 loss_cls
以查看模型预测地面实况框的能力。
另一方面,如果预测框与任何真实框不重叠,则“背景”类仅计算 loss_cls
。
然而,如果只有非常部分的与地面实况重叠,则预测框被“丢弃”并且不计算损失。我怀疑,出于某种原因,您的培训课程就是这种情况。
我建议您检查确定预测的盒装注释和地面实况注释之间关联的参数。此外,查看“锚点”的参数:这些参数决定了预测框的比例和纵横比。
【讨论】:
感谢您的快速回复。就我而言,数据集的数据很少,只有 3 个类,并且没有__background__
类。这个 Pytorch 实现非常复杂,我很难弄清楚如何调整与锚框和地面实况关联相关的参数。
@RakihthaRR 你应该有背景课程。
哦,我明白了。哪些对象应该属于背景类?反正我的课程在 COCO 中是没有的。
@RakihthaRR 背景是预测框,不涵盖任何其他类以上是关于什么是 loss_cls 和 loss_bbox 以及为什么它们在训练中总是为零的主要内容,如果未能解决你的问题,请参考以下文章