Matterport Mask-R-CNN 的损失到底是多少?

What exactly are the losses in Matterport Mask-R-CNN?

我使用 Mask-R-CNN 来训练我的数据。当我使用 TensorBoard 查看结果时,我有 loss, mrcnn_bbox_loss, mrcnn_class_loss , mrcnn_mask_loss, rpn_bbox_loss, rpn_class_loss 和验证的所有相同的 6 损失:val_loss, val_mrcnn_bbox_loss

我想知道每个损失到底是多少。

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

我的猜测是:

loss: 就是总结出来的所有5个loss(不知道TensorBoard是怎么总结的)

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

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

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

rpn_bbox_loss: bbox的大小是否正确?

rpn_class_loss: bbox的class是否正确?

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

如果我只有 1 个 class,是否有些丢失无关紧要?例如只有背景和另外 1 个 class?

我的数据只有背景和另外 1 个class,这是我在 TensorBoard 上的结果:

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

这是我的预测:

根据 Python 包索引中的 code comments and the documentation,这些损失定义为:

  • rpn_class_loss = RPN anchor classifier loss
  • rpn_bbox_loss = RPN边界框损失图
  • mrcnn_class_loss = Mask R-CNNclassifier head 的损失
  • mrcnn_bbox_loss = Mask R-CNN 边界框细化的损失
  • mrcnn_mask_loss = 掩码头部的掩码二元交叉熵损失

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

根据original paper如何计算这些损失,可以描述如下(注意,为了更直观的解释,定义相当粗略):

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

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