从层训练或者从检查点训练,model_main.py是主程序,除了这个程序,你只需要一个正确的管道配置文件。
所以对于微调,可以分为两个步骤,恢复权重和更新权重。两个步骤都可以根据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 {}
}
第 1 步,恢复权重。
在此步骤中,您可以通过设置fine_tune_checkpoint_type来配置要恢复的变量,选项有detection和classification。通过将其设置为detection,您基本上可以从检查点恢复几乎所有变量,通过将其设置为classification,仅恢复feature_extractor范围内的变量,(骨干网络中的所有层,如VGG、Resnet ,MobileNet,它们被称为特征提取器)。
以前这是由from_detection_checkpoint 和load_all_detection_checkpoint_vars 控制的,但这两个字段已被弃用。
另外请注意,配置fine_tune_checkpoint_type后,实际的恢复操作会检查图中的变量是否存在于检查点中,如果不存在,则该变量将通过例行初始化操作进行初始化。
举个例子,假设你想微调一个ssd_mobilenet_v1_custom_data模型并且你下载了检查点ssd_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警告,并且它们不会被恢复。
第 2 步,更新权重
现在您已恢复所有权重,并且您希望继续对自己的数据集进行训练(微调),通常这应该足够了。
但是如果你想尝试一些东西并且你想在训练过程中冻结一些层,那么你可以通过设置freeze_variables来自定义训练。假设您想冻结移动网络的所有权重并且只更新框预测器的权重,您可以设置freeze_variables: [feature_extractor],以便名称中包含feature_extractor 的所有变量都不会被更新。详情请看我写的another answer。
因此,要在您的自定义数据集上微调模型,您应该准备一个自定义配置文件。您可以从 sample config 文件开始,然后修改一些字段以满足您的需要。