【问题标题】:How to reset classes while retaining class specific weights in TensorFlow Object Detection API如何在 TensorFlow Object Detection API 中保留类特定权重的同时重置类
【发布时间】:2019-09-03 05:03:37
【问题描述】:

我目前正在使用 TensorFlow Object Detection API 并尝试从模型动物园微调预训练的 Faster-RCNN。目前,如果我选择与原始网络中使用的数量不同的类数,它根本不会从SecondStageBoxPredictor/ClassPredictor 初始化权重和偏差,因为它现在与原始ClassPredictor 具有不同的维度。但是,由于我想要训练网络的所有类都是原始网络已经被训练识别的类,我想保留与我想在SecondStageBoxPredictor/ClassPredictor 中使用的类相关的权重和偏差并修剪所有其他的,而不是简单地从头开始初始化这些值(类似于this function 的行为)。

这可能吗?如果可以,我将如何在 Estimator 中修改这一层的结构?

n.b. This question 提出了类似的问题,他们的回应是从网络输出中忽略不相关的类 - 然而,在这种情况下,我正在尝试微调网络,并且我认为这些冗余类的存在会使训练/评估复杂化过程?

【问题讨论】:

    标签: python tensorflow object-detection object-detection-api transfer-learning


    【解决方案1】:

    如果您要训练网络的所有类都是网络已被训练识别的类,那么您可以简单地使用网络进行检测,不是吗?

    但是,如果您有额外的课程并且想要进行迁移学习,您可以通过设置从检查点恢复尽可能多的变量:

    fine_tune_checkpoint_type: 'detection'
    load_all_detection_checkpoint_vars: True
    

    在管道配置文件中的字段train_config 中。

    最后通过计算图可以看出SecondStageBoxPredictor/ClassPredictor/weights的形状取决于输出类的数量。

    注意,在tensorflow中你只能在变量级别进行还原,如果两个变量的形状不同,一个不能用一个来初始化另一个。因此,在您的情况下,保留 weights 变量的某些值的想法是不可行的。

    【讨论】:

    • 非常感谢 - 唯一的问题是,如果我设置 load_all_detection_checkpoint_vars: True,似乎没有办法指定我想保留其权重/偏差的类。如果存在维度差异,有没有办法指定要保留哪些检查点变量?
    • 这里是如何选择要恢复的变量。 github.com/tensorflow/models/blob/… 如果load_all_detection_checkpoint_vars 为真,它将尝试查找检查点中存在的所有变量,然后恢复它们。但是,如果您想更精细地指定,则必须修改此 restore_map 函数,例如你可以从它返回的字典中过滤掉一些变量。
    • 非常感谢 :) 同样,如果我想修改特征提取器网络的前几层的结构,你知道我应该在 repo 中的哪个位置查看吗?跨度>
    • 此文件夹 (github.com/tensorflow/models/tree/master/research/…) 包含不同卷积网络的所有包装类。您可以看到他们使用slim 模块来构建这些特征提取器。 slim 模块包含许多预定义的 CNN,如 resnet、inception、vgg、alexnet 等。链接到slimgithub.com/tensorflow/models/tree/master/research/slim/nets
    猜你喜欢
    • 2019-01-22
    • 2018-01-28
    • 2018-01-14
    • 2021-01-02
    • 2019-04-22
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多