Tensorflow Object-Detection API - Fine-Tuning模型是如何工作的?

9

这是关于Tensorflow Object-Detection API的一个更一般性的问题。

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

然而,对于我来说,微调在API中的工作方式并不清楚。最后一层是否会自动重新初始化,还是我需要实现类似的操作?在README文件中,我没有找到任何有关这个主题的提示。也许有人可以帮助我。

1个回答

25

无论是从头开始进行训练还是从检查点开始训练,model_main.py都是主程序,除此程序外,您所需的只是一个正确的管道配置文件。

因此,对于微调,它可以分为两个步骤:恢复权重和更新权重。这两个步骤都可以根据proto文件中的train参数进行自定义配置,该proto与管道配置文件中的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来自定义训练。假设您希望冻结mobilenet的所有权重,并仅更新盒子预测器的权重,则可以设置freeze_variables:[feature_extractor],以使所有名称中包含feature_extractor的变量均不会被更新。有关详细信息,请参见我编写的另一个答案

因此,要在自定义数据集上微调模型,您应该准备一个自定义配置文件。您可以从示例配置文件开始,然后修改一些字段以适合您的需求。


我只是想从之前的一个检查点中恢复,但我只有 ckpt.meta / ckpt.datackpt.index 文件,而 fine_tune_checkpoint 字段却只接受一个 ckpt 文件? - KillerSnail
它期望检查点的根目录是model.ckpt。然后它知道要查找ckpt.datackpt.indexckpt.meta - Isaac Padberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接