15

感谢 Google 提供了一些带有 tensorflow API 的预训练模型

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

本地运行由存储库提供,但它完全用新训练的类替换了那些预训练的类。在那里,只提到了 train 和 eval。

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

4

1 回答 1

1

问题:我们如何向我已经训练好的网络添加更多类?

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

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

具体来说,我们将用一个完全连接的层替换最后一层,该层对于您的新类和旧类来说足够大。用随机权重初始化它,然后在你的类和其他一些类上训练它。训练后,将原始最后一个全连接层的原始权重复制到新训练的全连接层中。

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

你的最终网络将只有 1024x2 的新权重值(加上任何偏差),对应于你的新类。

需要注意的是,虽然这会快速训练并提供快速结果,但它的性能不如在完整和全面的数据集上进行再训练。

也就是说,它仍然可以正常工作;)

这是关于如何替换最后一层的参考如何从其他人回答的 Tensorflow 中的训练模型中删除最后一层

于 2020-08-07T23:05:10.453 回答