sai*_*hor 9 python object-detection training-data tensorflow pre-trained-model
感谢Google,它提供了一些预先训练好的模型和tensorflow API.
我想知道如何通过向模型中添加新类来重新训练从上述存储库中获得的预训练模型.例如,COCO数据集训练模型有90个类,我想将1或2个类添加到现有类中,结果得到一个92类对象检测模型.
本地运行由存储库提供,但它完全用新训练的类替换那些预训练的类,只提到列车和评估.
那么,有没有其他方法来重新训练模型并获得92个课程?
问题:我们如何向我已经训练好的网络添加更多的类?
具体来说,除了新类的输出之外,我们希望保持所有网络不变。这意味着对于像 ResNet 这样的东西,我们希望冻结最后一层以外的所有内容,并以某种方式扩展最后一层以拥有新的类。
答案:将现有的最后一层与您训练的新层相结合
具体来说,我们将用一个完全连接的层替换最后一层,该层对于新类和旧类来说足够大。使用随机权重对其进行初始化,然后在您的班级和其他一些班级上对其进行训练。训练后,将原始最后一个全连接层的原始权重复制到新训练的全连接层中。
例如,如果之前的最后一层是 1024x90 矩阵,而新的最后一层是 1024x92 矩阵,请将 1024x90 复制到新的 1024x92 中的相应空间中。这将破坏性地用预先训练的值替换旧类的所有训练,但保留新类的训练。这很好,因为您可能没有使用相同数量的旧类来训练它。如果有偏见的话,也可以做同样的事情。
您的最终网络将只有 1024x2 个新权重值(加上任何偏差),与您的新类别相对应。
需要注意的是,尽管这可以快速训练并提供快速结果,但它的表现不如在完整且全面的数据集上进行再训练。
也就是说,它仍然可以很好地工作;)
这是关于如何替换最后一层的参考How to remove the last layer from trained model in Tensorflow其他人回答