如何调整现有的Tensorflow目标检测模型以识别其他类别?

16

感谢Google提供了与TensorFlow API一起使用的几个预先训练好的模型

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

本地运行是该存储库提供的,但它会完全替换这些预训练类别为新训练的类别。只有train和eval被提及。

所以,还有其他方法重新训练模型并获得92个类别的结果吗?


6
这是一个热门的研究课题,如果你找到了好的解决方案,请告诉我。作为一种快速且简单的处理方法:在倒数第二个90类全连接层之前添加一个2类全连接层。仅训练该小层,以保持90个类别不变。在测试时运行两个层,并将结果连接成92个类别。这样行得通吗?如果可以,请写一篇论文并将我列为共同作者 ;) - Ivan Aksamentov - Drop
这可能会有所帮助:https://dev59.com/Kqfja4cB1Zd3GeqPrzP1?rq=1 - Salman Ghauri
2
我投票关闭此问题,因为这不是一个软件开发问题,更适合其他 Stack Exchange 网站,如 [stats.se] 或 [datascience.se]。 - David Buck
1个回答

1

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

具体来说,我们想保持所有网络不变,只更改新类别的输出。这意味着对于像ResNet这样的网络,我们想保留除最后一层之外的所有内容,并以某种方式扩展最后一层以包含新的类别。

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

具体来说,我们将用足够大的全连接层替换最后一层,以容纳您的新类别和旧类别。使用随机权重进行初始化,然后在您的类别和其他少量类别上进行训练。训练完成后,将原始最后一个全连接层的权重复制到您新训练的全连接层中。

例如,如果先前的最后一层是1024x90矩阵,而您的新最后一层是1024x92矩阵,则将1024x90复制到新的1024x92相应位置。这将破坏性地替换所有旧类别的训练,但保留您新类别的训练。这很好,因为您可能没有使用相同数量的旧类别进行训练。如果有偏差,则同样处理。

你的最终网络只有1024x2个新权重值(加上任何偏置),对应于你的新类别。 需要注意的是,虽然这种方法训练速度快,能够快速得到结果,但它的表现不如在全面的数据集上重新训练。 尽管如此,它仍然可以很好地工作 ;)
这里提供了一个参考,说明如何替换最后一层如何从Tensorflow训练模型中删除最后一层,由其他人回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接