在自定义数据集上训练 Faster-RCNN 模型时加载检查点

Posted

技术标签:

【中文标题】在自定义数据集上训练 Faster-RCNN 模型时加载检查点【英文标题】:Loading checkpoints while training a Faster-RCNN model on a custom dataset 【发布时间】:2021-12-10 02:16:09 【问题描述】:

我正在尝试使用 Faster-RCNN 架构(准确地说是Faster R-CNN ResNet50 V1 640x640,来自here)加载检查点并填充模型权重。我正在尝试为该网络加载权重,类似于它在example notebook for RetinaNet,他们在其中执行以下操作:

fake_box_predictor = tf.compat.v2.train.Checkpoint(
    _base_tower_layers_for_heads=detection_model._box_predictor._base_tower_layers_for_heads,
    _box_prediction_head=detection_model._box_predictor._box_prediction_head,
)

fake_model = tf.compat.v2.train.Checkpoint(
          _feature_extractor=detection_model._feature_extractor,
          _box_predictor=fake_box_predictor
)

ckpt = tf.compat.v2.train.Checkpoint(model=fake_model)
ckpt.restore(checkpoint_path).expect_partial()

我正在尝试为我想要使用的 Faster-RCNN 网络提供类似的检查点加载机制,但 _base_tower_layers_for_heads_box_prediction_head 等属性仅适用于示例中使用的架构,而不适用于还有什么。

对于我的特定用例,我也找不到关于使用 Checkpoint 填充模型的哪些部分的文档。非常感谢任何有关如何解决此问题的帮助!

【问题讨论】:

【参考方案1】:

正如您所说,您遇到的主要问题是您没有要在其上进行迁移学习的层的层张量。 这是 Zoo 中 Faster R-CNN ResNet50 V1 640x640 副本的原始实现的一部分。他们没有命名图层,或者他们确实命名了但没有公布名称(或代码)。 要解决这个问题,您需要找出要保留哪些层以及要重新学习哪些层。您可以使用 (ref) 打印出网络中的所有层:

[n.name for n in tf.get_default_graph().as_graph_def().node]

层的名称可以手动添加,但 tf 为每个节点保留默认名称。这个列表可能很长而且很累,但是你需要找到张量来开始你的迁移学习。因此,您需要按照列表并尝试了解要冻结的层以及要继续学习过程的层。冻结图层 (ref):

if layer.name == 'layer_name':
    layer.trainable = False

【讨论】:

以上是关于在自定义数据集上训练 Faster-RCNN 模型时加载检查点的主要内容,如果未能解决你的问题,请参考以下文章

YOLOv8已至,精度大涨!教你如何在自定义数据集上训练它

在自定义数据集上训练 tensorflow attention-ocr 的管道是啥?

深度学习和目标检测系列教程 10-300:通过torch训练第一个Faster-RCNN模型

Tensorboard mAP 分数都是 0,即使 loss 很低

在自定义数据集上微调 MobileNet 时出现形状错误

机器学习笔记 - 使用TensorFlow Lite从头创建模型