2

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

当在 SSD 等 ML 对象检测模型中微调预训练模型时,我不仅可以使用预训练的权重初始化特征提取器权重,还可以初始化特征图的定位层权重和分类层权重,只有后者选择预先训练的类权重,这样我就可以减少模型最初可以识别的类的数量(例如,从 90 个 MSCOCO 类到这 90 个类中的任何一个类,如仅汽车和行人等)
https ://github.com/pierluigiferrari/ssd_keras/blob/master/weight_sampling_tutorial.ipynb
这就是在 keras 模型(即在 h5 文件中)中的完成方式,我也想在 Tensorflow 对象检测 API 中执行相同的操作。似乎在训练时我可以在配置 protobuf 文件中指定新模型将具有的类的数量,但是由于我是 API(和 tensorflow)的新手,所以我无法遵循源结构并了解如何在微调时处理该数字。我知道的大多数 SSD 模型只是忽略并初始化分类权重张量,以防预训练模型的类权重形状与新模型的分类权重形状不同,但我想保留必要的分类权重并对其进行训练。另外,我将如何在 API 结构中做到这一点?
谢谢!

4

1 回答 1

1

当我阅读代码时,我找到了负责的代码,如果新定义的模型和预训练模型之间的层的形状匹配,它只会保留预训练模型的权重。所以如果我改变类的数量,分类器层的形状就会改变,并且不会保留预训练的权重。

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

于 2018-03-20T07:50:30.197 回答