【问题标题】:Tensorflow Object-Detection API - How does the Fine-Tuning of a model works?Tensorflow Object-Detection API - 模型的微调是如何工作的?
【发布时间】:2019-09-24 11:54:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: tensorflow machine-learning object-detection


    【解决方案1】:

    从层训练或者从检查点训练,model_main.py是主程序,除了这个程序,你只需要一个正确的管道配置文件。

    所以对于微调,可以分为两个步骤,恢复权重和更新权重。两个步骤都可以根据trainproto file自定义配置,这个proto对应pipeline配置文件中的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 文件开始,然后修改一些字段以满足您的需要。

    【讨论】:

    • 我只是想从以前运行的检查点恢复,但我只有 ckpt.meta / ckpt.datackpt.indexfine_tune_checkpoint 字段只需要一个 ckpt 文件?
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2018-01-28
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多