gpt4 book ai didi

python - pytorch Faster-RCNN 的验证损失

转载 作者:行者123 更新时间:2023-12-03 14:47:56 27 4
gpt4 key购买 nike

我目前正在使用从 pytorch 预训练的 Faster-RCNN 模型(如在 torchvision tutorial 中)的迁移学习在自定义数据集上进行对象检测。
我想在每个时期结束时计算验证损失字典(如在训练模式下)。
我可以在训练模式下运行模型进行验证,如下所示:

model.train()
for images, targets in data_loader_val:
images = [image.to(device) for image in images]
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

with torch.no_grad():
val_loss_dict = model(images, targets)
print(val_loss_dict)

但我不认为这是“正确”的验证方式(导致一些特殊层,如 dropout 和 batch norm 在 eval/train 模式下的工作方式不同)。并且在 eval 模式下,模型返回预测的 bbox(如预期的那样)。我可以为此使用一些内置功能吗?

谢谢。

最佳答案

有一些关于这个问题的讨论here .结论是在训练模式下计算验证损失是绝对有效的。 val loss的数值本身没有意义,只有趋势很重要以防止过拟合。因此,虽然训练模式确实改变了损失的数值,但它仍然可以使用。

然而,这里还有另一个效率问题,以防您在验证过程中还需要模型输出(通常用于计算 IoU、准确性等)。现在,torchvision 中的 RCNN 会根据训练/评估模式为您提供损失或输出。
更新:
不幸的是,我意识到此修复程序不起作用。必须修补所有子模块以计算损失和输出。太糟糕了。

My dirty solution was patching the GeneralizedRCNN class from whichFasterRCNN inherits. The problem is inthisline, in eager_outputs(). The workaround:

    return losses, detections

model = fasterrcnn_resnet50_fpn() model.eager_outputs =
eager_outputs_patch

Now you can get both outputs after a single inference run: model.train() with torch.no_grad(): loss_dict, outputs = model(images, targets). # yaay, now we have both! Note that you still need to put your model to train mode inorder to have the losses too. In eval mode GeneralizedRCNN'ssubmodules (rpn, roi_heads) don't calculate any loss, and loss_dictis empty.

关于python - pytorch Faster-RCNN 的验证损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60339336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com