Tensorflow 对象检测 API - 模型的微调是如何工作的?

Tensorflow Object-Detection API - How does the Fine-Tuning of a model works?

这是一个关于 Tensorflow 对象检测的更普遍的问题 API。

我正在使用这个 API,更具体地说,我根据我的数据集微调了一个模型。根据 API 的描述,我使用 model_main.py 函数从给定的 checkpoint/frozen 图重新训练模型。

但是,我不清楚 API 中的微调是如何工作的。最后一层的重新初始化是自动发生的还是我必须实现类似的东西? 在 README 文件中,我没有找到关于这个主题的任何提示。也许有人可以帮助我。

从stratch训练或从checkpoint训练,model_main.py是主程序,除了这个程序,你只需要一个正确的流水线配置文件。

所以对于fine-tuning,可以分为两步,恢复权重和更新权重。这两个步骤都可以根据trainproto file自定义配置,这个proto对应pipeline配置文件中的train_config

train_config: {
   batch_size: 24
   optimizer { }
   fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt"
   fine_tune_checkpoint_type:  "detection"
   # Note: The below line limits the training process to 200K steps, which we
   # empirically found to be sufficient enough to train the pets dataset. This
   # effectively bypasses the learning rate schedule (the learning rate will
   # never decay). Remove the below line to train indefinitely.
   num_steps: 200000
   data_augmentation_options {}
 }

第一步,恢复权重。

这一步可以通过设置fine_tune_checkpoint_type来配置要恢复的变量,选项有detectionclassification。通过将它设置为 detection 基本上你可以从检查点恢复几乎所有变量,通过将它设置为 classification,只有来自 feature_extractor 范围的变量被恢复,(所有层在 backbone 网络,如 VGG、Resnet、MobileNet,它们被称为特征提取器)。

以前这是由 from_detection_checkpointload_all_detection_checkpoint_vars 控制的,但这两个字段已弃用。

另请注意,在您配置了fine_tune_checkpoint_type后,实际的恢复操作会检查图表中的变量是否存在于检查点中,如果不存在,则将使用常规初始化操作对变量进行初始化。

举个例子,假设你想fine-tune一个ssd_mobilenet_v1_custom_data模型,你下载了checkpointssd_mobilenet_v1_coco,当你设置fine_tune_checkpoint_type: detection时,那么所有变量在检查点文件中也可用的图形将被恢复,框预测器(最后一层)权重也将被恢复。但是,如果您设置 fine_tune_checkpoint_type: classification,则仅恢复 mobilenet 层的权重。但是如果你使用不同的模型检查点,比如说 faster_rcnn_resnet_xxx,那么因为图表中的变量在检查点中不可用,你会看到输出日志说 Variable XXX is not available in checkpoint 警告,并且它们不会被恢复.

第二步,更新权重

现在你已经恢复了所有的权重并且你想在你自己的数据集上继续训练(fine-tuning),通常这应该足够了。

但是如果你想尝试一些东西并且你想在训练过程中冻结一些层,那么你可以通过设置 freeze_variables 来自定义训练。假设您想冻结 mobilenet 的所有权重并且只更新框预测器的权重,您可以设置 freeze_variables: [feature_extractor] 以便名称中包含 feature_extractor 的所有变量都不会更新。详细信息请看我写的

因此,对于 fine-tune 自定义数据集上的模型,您应该准备一个自定义配置文件。您可以从 sample config 文件开始,然后修改一些字段以满足您的需要。