如何让现有模型识别其他类?

时间:2017-10-04 19:18:37

标签: python tensorflow object-detection training-data pre-trained-model

感谢Google,它提供了few pre-trained models with tensorflow API

我想知道如何通过向模型添加新类来重新训练从上述存储库中获得的预训练模型。 例如,COCO数据集训练模型有90个类,我想在现有类中添加1或2个类,并得到一个92类对象检测模型。

Running Locally由存储库提供,但它完全用新训练的类替换那些预训练的类,只提到了训练和评估。

那么,有没有其他方法可以重新训练模型并获得92个课程?

1 个答案:

答案 0 :(得分:0)

问题:我们如何向已经训练有素的网络中添加更多课程?

具体来说,我们希望所有网络保持不变,而不是新类的输出。这意味着对于像ResNet这样的东西,我们希望冻结除最后一层之外的所有内容,并以某种方式扩展最后一层以拥有我们的新类。

答案:将现有的最后一层与您要训练的新层相结合

具体地说,我们将用完全连接的层替换最后一层,该层对于新类和旧类都足够大。使用随机权重对其进行初始化,然后在您的课程和其他课程中对其进行训练。训练后,将原始的最后一个完全连接层的原始权重复制到新的经过训练的完全连接层中。

例如,如果先前的最后一层是1024x90矩阵,而新的最后一层是1024x92矩阵,则将1024x90复制到新的1024x92中的相应空间中。这将破坏性地将您对旧班级的所有培训替换为预先训练的值,而使您不再培训新班级。那样很好,因为您可能没有使用相同数量的旧课程进行培训。如果有偏见,请做同样的事情。

您的最终网络将仅具有1024x2的新权重值(加上任何偏差),与您的新班级相对应。

请注意,尽管这样做可以快速训练并提供快速的结果,但在对完整而全面的数据集进行重新训练时,效果不佳。

也就是说,它仍然可以很好地工作;)

此处引用了如何替换其他人回答的最后一层How to remove the last layer from trained model in Tensorflow