对于我的论文,我试图修改 faster-rcnn 在识别表结构方面的损失函数。
目前我正在使用Facebook的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 进行了"绑定"(不知道正确的单词),它本身是一个 pylib,后面有一个编译的库。
我是否找错了地方对这个损失函数进行小幅调整,或者我真的必须从 dcaffe 打开 de 源代码,调整损失,重新编译库?
迎接
你应该自己实现损失函数。修改库源代码并重新编译它 - 这不是一个好主意:)
您可以创建python函数,该函数将获取GT和预测数据并返回损失值。
您也可以创建当前使用的L1平滑或交叉熵的副本,然后,当您确定它们相同时,您可以修改它们。或者,例如,您可以实现盒子的 L2 损失并改用它。
有关自定义损失的更多信息,您可以在咖啡费文档中找到。