这是一个关于Tensorflow对象-检测API的更普遍的问题。
我正在使用这个API,更确切地说,我微调了一个模型到我的数据集。根据API的描述,我使用model_main.py函数从给定的检查点/冻结图重新训练模型。
然而,我不清楚微调在API中是如何工作的。最后一层的重新初始化是自动发生的还是我必须实现类似的东西?在README文件中,我没有找到任何关于这个主题的提示。也许有人能帮我。
发布于 2019-05-08 12:59:21
培训或培训从一个检查点,model_main.py是主程序,除了这个程序,您需要的是一个正确的管道配置文件。
因此,对于微调,它可以分为两个步骤,恢复权重和更新权重.这两个步骤都可以根据列车原文件定制配置,此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模型,并且在设置fine_tune_checkpoint_type: detection时下载了检查点ssd_mobilenet_v1_coco,那么检查点文件中也可用的图形中的所有变量都将被恢复,而--盒子预测器(最后一层)的权重也将恢复为。但是,如果设置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的变量都不会被更新。有关详细信息,请参阅我所写的另一个答案。
因此,要对自定义数据集上的模型进行微调,应准备一个自定义配置文件。您可以从样例配置文件开始,然后修改一些字段以满足您的需要。
https://stackoverflow.com/questions/56012092
复制相似问题