TensorFlow对象检测API:使用预训练模型在训练中更改班级数量时的分类权重初始化


问题内容

我不仅要利用特征提取器预训练的权重,还要利用特征图图层的分类器/本地化预训练的权重来使用Tensorflow对象检测API微调Tensorflow对象检测模型(SSD)。当我的新模型与用于微调检查点的预训练模型具有不同数量的类时,TensorFlow对象检测API将如何处理分类权重张量?

当在ML对象检测模型(例如SSD)中微调预训练的模型时,我不仅可以使用预训练的权重来初始化特征提取器权重,还可以使用仅训练后的权重来初始化特征图的本地化层权重和分类层权重。选择选择的预先训练的班级权重,这样我就可以减少模型最初可以识别的班级数量(例如,从90个MSCOCO班级减少到这90个班级中选择的任何一个班级,例如仅汽车和行人等)
https
://github.com/pierluigiferrari/ssd_keras/blob/master/weight_sampling_tutorial.ipynb

这是在keras模型中(即在h5文件中)完成的方式,我也想在Tensorflow对象检测API中执行相同的操作。似乎在训练时我可以在config
protobuf文件中指定新模型将要拥有的类数,但是由于我是API(和tensorflow)的新手,所以我无法遵循源代码结构并了解如何微调该数字。我知道的大多数SSD模型只是忽略并初始化分类权重张量,以防预训练模型的类权重形状与新模型的分类权重形状不同,但是我想保留必要的分类权重并对其进行训练。另外,我将如何在API结构中执行此操作?
谢谢!


问题答案:

当我通读代码时,我发现了负责的代码,只有在新定义的模型和预训练的模型之间的层的形状匹配时,该代码才保留预训练的模型的权重。因此,如果更改班级数量,则分类器层的形状会更改,并且不会保留预训练的权重。

https://github.com/tensorflow/models/blob/master/research/object_detection/utils/variables_helper.py#L133