这是关于Tensorflow Object-Detection API的一个更一般性的问题。
我正在使用该API,更具体地说,我正在针对我的数据集微调模型。根据API的描述,我使用model_main.py
函数从给定的检查点/冻结图重新训练模型。
然而,对于我来说,微调在API中的工作方式并不清楚。最后一层是否会自动重新初始化,还是我需要实现类似的操作?在README
文件中,我没有找到任何有关这个主题的提示。也许有人可以帮助我。
这是关于Tensorflow Object-Detection API的一个更一般性的问题。
我正在使用该API,更具体地说,我正在针对我的数据集微调模型。根据API的描述,我使用model_main.py
函数从给定的检查点/冻结图重新训练模型。
然而,对于我来说,微调在API中的工作方式并不清楚。最后一层是否会自动重新初始化,还是我需要实现类似的操作?在README
文件中,我没有找到任何有关这个主题的提示。也许有人可以帮助我。
无论是从头开始进行训练还是从检查点开始训练,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
来配置要恢复的变量,选项包括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
来自定义训练。假设您希望冻结mobilenet的所有权重,并仅更新盒子预测器的权重,则可以设置freeze_variables:[feature_extractor]
,以使所有名称中包含feature_extractor
的变量均不会被更新。有关详细信息,请参见我编写的另一个答案。
因此,要在自定义数据集上微调模型,您应该准备一个自定义配置文件。您可以从示例配置文件开始,然后修改一些字段以适合您的需求。
ckpt.meta
/ckpt.data
和ckpt.index
文件,而fine_tune_checkpoint
字段却只接受一个ckpt
文件? - KillerSnailmodel.ckpt
。然后它知道要查找ckpt.data
,ckpt.index
和ckpt.meta
。 - Isaac Padberg