我目前正在使用 TensorFlow Object Detection API并试图从模型动物园微调预训练的 Faster-RCNN。目前,如果我选择与原始网络中使用的数量不同的类别,它不会从 SecondStageBoxPredictor/ClassPredictor
初始化权重和偏差,因为它现在具有与原始 类预测器
。但是,由于我想在网络上训练的所有类都是原始网络经过训练可以识别的类,因此我想保留与我想在 SecondStageBoxPredictor/ClassPredictor 中使用的类相关的权重和偏差
并修剪所有其他值,而不是简单地从头开始初始化这些值(类似于 this function 的行为)。
这是否可能?如果可能,我将如何在 Estimator 中修改该层的结构?
注意This question问了类似的事情,他们的回答是忽略网络输出中不相关的类——然而,在这种情况下,我试图微调网络,我假设这些冗余类的存在会使训练/评估过程复杂化?
最佳答案
如果您想要训练网络的所有类别都是网络经过训练可以识别的类别,您可以简单地使用网络进行检测,不是吗?
但是,如果你有额外的类(class)并且你想进行迁移学习,你可以通过设置从检查点恢复尽可能多的变量:
fine_tune_checkpoint_type: 'detection'
load_all_detection_checkpoint_vars: True
在管道配置文件的 train_config
字段中。
最后,通过查看计算图,可以看出 SecondStageBoxPredictor/ClassPredictor/weights
的形状取决于输出类的数量。
请注意,在tensorflow中你只能在变量级别恢复,如果两个变量有不同的形状,一个不能用一个来初始化另一个。因此,在您的情况下,保留 weights
变量的某些值的想法是不可行的。
关于python - 如何在 TensorFlow 对象检测 API 中保留类特定权重的同时重置类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55651492/