2

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

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

nb这个问题问了一个类似的问题,他们的回答是从网络输出中忽略不相关的类——然而,在这种情况下,我正在尝试微调网络,我假设这些冗余类的存在会使训练/评估复杂化过程?

4

1 回答 1

1

如果你想训练网络的所有类都是网络已经被训练识别的类,你可以简单地使用网络来检测,不是吗?

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

fine_tune_checkpoint_type: 'detection'
load_all_detection_checkpoint_vars: True

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

最后,通过查看计算图,可以看出 的形状SecondStageBoxPredictor/ClassPredictor/weights取决于输出类的数量。 在此处输入图像描述

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

于 2019-04-12T12:40:17.173 回答