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

时间:2019-05-06 20:36:39

标签: tensorflow machine-learning object-detection

这是有关Tensorflow对象检测API的更一般的问题。

我正在使用此API,更具体地说,我将模型微调到我的数据集。根据API的描述,我使用model_main.py函数从给定的检查点/冻结图重新训练模型。

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

1 个答案:

答案 0 :(得分:0)

{str}训练或从检查点训练,model_main.py是主程序,除了该程序外,您所需要的只是正确的管道配置文件。

因此,为了进行微调,可以将其分为两个步骤:还原权重和更新权重。可以根据火车proto file自定义配置这两个步骤,该原型对应于管道配置文件中的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来配置要恢复的变量,选项为detectionclassification。通过将其设置为detection,基本上可以从检查点还原几乎所有变量,并将其设置为classification,则仅还原来自feature_extractor范围的变量(主干中的所有层)网络,例如VGG,Resnet,MobileNet,它们称为功能提取器)。

以前,这是由from_detection_checkpointload_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文件开始,然后修改一些字段以满足您的需求。