14

我使用 Mask-R-CNN 来训练我的数据。当我使用 TensorBoard 查看结果时,我有损失, mrcnn_bbox_lossmrcnn_class_lossmrcnn_mask_lossrpn_bbox_lossrpn_class_loss和所有相同的 6 个验证损失:val_loss、 val_mrcnn_bbox_loss等。

我想知道每个损失到底是什么。

另外我想知道前6个损失是火车损失还是它们是什么?如果他们不是火车损失,我怎么能看到火车损失?

我的猜测是:

loss:总结起来就是 5 个 loss(但我不知道 TensorBoard 是如何总结的)。

mrcnn_bbox_loss:边界框的大小是否正确?

mrcnn_class_loss:类正确吗?像素是否正确分配给类?

mrcnn_mask_loss:实例的形状是否正确?像素是否正确分配给实例?

rpn_bbox_loss : bbox 的大小是否正确?

rpn_class_loss : bbox 的类是否正确?

但我很确定这是不对的......

如果我只有 1 个班级,一些损失是否无关紧要?例如只有背景和其他1个类?

我的数据只有背景和 1 个其他类,这是我在 TensorBoard 上的结果:

结果1:结果 2:结果 3:结果:4

我的预测没问题,但我不知道为什么我的验证中的一些损失最终会上下波动……我认为它必须首先下降,然后过度拟合后才上升。我使用的预测是 TensorBoard 上具有最多 epoch 的绿线。我不确定我的网络是否过度拟合,因此我想知道为什么验证中的一些损失看起来如何......

这是我的预测: 我的火车组示例: 这是我的测试集示例的基本事实: 这是来自测试集示例的预测:

4

1 回答 1

23

根据 Python 包索引中的代码注释文档,这些损失定义为:

  • rpn_class_loss = RPN 锚分类器损失
  • rpn_bbox_loss = RPN 边界框损失图
  • mrcnn_class_loss = Mask R-CNN 分类器头的损失
  • mrcnn_bbox_loss = Mask R-CNN 边界框细化的损失
  • mrcnn_mask_loss = 掩码头的掩码二元交叉熵损失

这些损失指标中的每一个都是为每个感兴趣区域单独计算的所有损失值的总和。日志中给出的一般损失指标是 Mask R-CNN 的作者定义的其他五个损失的总和(您可以通过将它们相加来检查)。

根据原始论文如何计算这些损失,它们可以描述如下(请注意,为了更直观的解释,定义非常粗略):

  • 分类损失值基本上取决于真实类的置信度分数,因此分类损失反映了模型在预测类标签时的置信度,或者换句话说,模型与预测正确类的接近程度。在 mrcnn_class_loss 的情况下,所有对象类都被覆盖,而在 rpn_class_loss 的情况下,唯一完成的分类是将锚框标记为前景或背景(这就是为什么这种损失往往具有较低值的原因,从概念上讲只有“两类”可以预测)。
  • 边界框损失值反映了真实框参数(即框位置的 (x,y) 坐标、其宽度和高度)与预测框参数之间的距离。它本质上是一种回归损失,它惩罚较大的绝对差异(对于较小的差异,以近似指数的方式,对于较大的差异,以线性方式 - 请参阅平滑 L1 损失函数以获得更多信息)。因此,在 rpn_bbox_loss 的情况下,它最终显示了模型在图像中定位对象的能力;以及模型在精确预测图像中与不同对象相对应的区域方面有多好在 mrcnn_bbox_loss 的情况下存在。
  • 与分类损失类似,掩码损失会惩罚错误的每像素二元分类(前景/背景,相对于真实类标签)。每个感兴趣区域的计算方式不同:Mask R-CNN 为每个 RoI 对每个类编码一个二进制掩码,并且特定 RoI 的掩码损失仅基于与其真实类对应的掩码计算,即防止掩码损失受到类预测的影响。

正如您已经说过的,这些损失指标确实是训练损失,而带有val_前缀的是验证损失。验证损失的波动可能由于多种不同的原因而发生,仅根据您的图表很难一目了然。它们可能是由于学习率太高(在尝试找到最小值时导致随机梯度下降过冲)或验证集太小(这会给出不可靠的损失值,因为输出中的微小变化会产生损失值变化大)。

于 2019-04-11T13:08:26.267 回答