如何微调现有的 TensorFlow 对象检测模型以识别其他类? [关闭]

Posted

技术标签:

【中文标题】如何微调现有的 TensorFlow 对象检测模型以识别其他类? [关闭]【英文标题】:How to Fine tune existing Tensorflow Object Detection model to recognize additional classes? [closed] 【发布时间】:2018-03-16 07:15:30 【问题描述】:

感谢 Google 提供few pre-trained models with tensorflow API。

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

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

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

【问题讨论】:

这是一个热门的研究课题,如果你能找到一个好的解决方案,请告诉我。作为一个快速而肮脏的 hack:在最后 90 级 FC 层之前的层附加一个 2 级 FC 层。只训练那个微小的层,这样 90 个类就完好无损。在测试时运行两个层并将结果连接到 92 个类中。这行得通吗?如果是,请写一篇论文并加我为合著者;) 这可能会有所帮助:***.com/questions/47591750/… 我投票结束这个问题,因为这不是软件开发问题,更适合不同的 Stack Exchange 站点,例如 Cross Validated 或 Data Science 【参考方案1】:

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

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

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

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

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

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

请注意,虽然这会快速训练并提供快速结果,但它的表现不如在完整和全面的数据集上重新训练。

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

这里是如何替换别人回答的最后一层How to remove the last layer from trained model in Tensorflow的参考

【讨论】:

以上是关于如何微调现有的 TensorFlow 对象检测模型以识别其他类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥来自 Tensorflow 2 对象检测 API 的微调模型上的 mAP 较低?

如何使用现有的和更新的类微调 keras 模型?

尝试在 TensorFlow 中微调 GPT-2 模型时出现 ValueError

我如何使用 tensorflow 对象检测来仅检测人员?

使用 Tensorflow 2 对象检测 API 冻结了哪些层?

TensorFlow 对象检测 API 中的超参数优化