Matterport Mask-R-CNN 的损失究竟是啥?

Posted

技术标签:

【中文标题】Matterport Mask-R-CNN 的损失究竟是啥?【英文标题】:What exactly are the losses in Matterport Mask-R-CNN?Matterport Mask-R-CNN 的损失究竟是什么? 【发布时间】:2019-08-17 00:29:04 【问题描述】:

我使用 Mask-R-CNN 来训练我的数据。当我使用 TensorBoard 查看结果时,我有 loss, mrcnn_bbox_loss, mrcnn_class_loss, mrcnn_mask_loss, rpn_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 上的结果:

我的预测是好的,但我不知道为什么我的验证中的一些损失在最后会上下波动......我认为它必须首先只下降,然后在过度拟合之后只上升。 我使用的预测是 TensorBoard 上具有最多 epoch 的绿线。我不确定我的网络是否过度拟合,因此我想知道为什么验证中的一些损失看起来像它们的样子......

这是我的预测:

【问题讨论】:

您是如何绘制这些显示参数的图表的?可以分享一下代码吗 【参考方案1】:

根据 Python Package Index 中的code comments 和documentation,这些损失定义为:

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

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

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

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

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

【讨论】:

感谢您的回答!你知道我在哪里可以找到这 5 个损失中的每一个的损失函数吗?数学方程。在 Mask RCNN 中,我认为只解释了 Lmask。不是通过方程式,而是通过说它是具有二进制交叉熵的每像素 Sigmoid。在 Fast-RCNN 和 Faster-RCNN 论文中也有损失,但我不知道 Mask R-CNN 中实际使用了哪一个。我需要的是这样的:Lmask = ... Lclass= ... Lbbox = ... RPNclass= ... RPNbbox = ...

以上是关于Matterport Mask-R-CNN 的损失究竟是啥?的主要内容,如果未能解决你的问题,请参考以下文章

mask-rcnn-model

关于跑别人代码中遇到的问题

tensorflow版的Mask_RCNN

tensorflow版的Mask_RCNN

(4)损失函数

损失函数(损失函数代价函数目标函数)​​​​​​​MSE0-1损失函数绝对误差损失函数分位数损失函数Huber损失函数感知损失函数Hinge损失函数指数损失函数对数损失函数