这是有关Tensorflow对象检测API的更一般的问题。
我正在使用此API,更具体地说,我将模型微调到我的数据集。根据API的描述,我使用model_main.py
函数从给定的检查点/冻结图重新训练模型。
但是,我不清楚微调在API中如何工作。最后一层的自动初始化会自动发生还是我必须实现类似的东西?
在README
文件中,我没有发现任何与此主题相关的提示。也许有人可以帮助我。
答案 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
来配置要恢复的变量,选项为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文件开始,然后修改一些字段以满足您的需求。