2

对于我的论文,我正在尝试修改 fast-rcnn 在识别表结构方面的损失函数。

目前我正在使用 Facebooks Detectron。似乎工作得很好,但我现在正在积极尝试修改损失函数。调试我的代码我注意到这是添加损失函数的地方fast_rcnn_heads.py:75

def add_fast_rcnn_losses(model):
"""Add losses for RoI classification and bounding box regression."""
cls_prob, loss_cls = model.net.SoftmaxWithLoss(
    ['cls_score', 'labels_int32'], ['cls_prob', 'loss_cls'],
    scale=model.GetLossScale()
)
loss_bbox = model.net.SmoothL1Loss(
    [
        'bbox_pred', 'bbox_targets', 'bbox_inside_weights',
        'bbox_outside_weights'
    ],
    'loss_bbox',
    scale=model.GetLossScale()
)
loss_gradients = blob_utils.get_loss_gradients(model, [loss_cls, loss_bbox])
model.Accuracy(['cls_prob', 'labels_int32'], 'accuracy_cls')
model.AddLosses(['loss_cls', 'loss_bbox'])
model.AddMetrics('accuracy_cls')
return loss_gradients

调试器找不到 mode.net.SmoothL1Loss 或 SoftmaxWithLoss 的任何声明或实现。Detectron 使用 caffe,当我查看 net_builder(它启动了 model.net)时,我看到它对 caffe2 进行了“绑定”(不知道正确的词),caffe2 本身就是一个 pylib,后面有一个编译的库。

我是否在错误的地方对这个损失函数进行了微调,或者我真的必须从 dcaffe 打开 de 源代码,调整损失,重新编译 lib?

问候,

4

1 回答 1

0

您应该自己实现损失函数。修改库源代码并重新编译它 - 不是一个好主意:)

您可以创建 python 函数,它将获取 GT 和预测数据以及返回损失值。

您还可以创建当前使用的 L1-smooth 或 Cross-entropy 的副本,然后,当您确定它们相同时,您可以修改它们。或者,您可以为盒子实现 L2 损失并改用它。

您可以在 caffee 文档中找到有关自定义损失的更多信息。

于 2019-01-23T14:47:55.137 回答