Machine learning 如何在TensorFlow中为预训练的Inception v3模型添加新的类别和培训?

Machine learning 如何在TensorFlow中为预训练的Inception v3模型添加新的类别和培训?,machine-learning,tensorflow,Machine Learning,Tensorflow,我正试图利用一个预先训练过的模型,如Inception v3(在2012 ImageNet数据集上训练),并将其扩展到几个缺失的类别中 我用Ubuntu14.04上的CUDA从源代码构建了TensorFlow,像flowers上的迁移学习这样的例子非常有效。然而,花卉示例去掉了最后一层并删除了所有1000个现有类别,这意味着它现在可以识别5种花卉,但不能再识别熊猫 如何将这5个花卉类别添加到ImageNet现有的1000个类别中(并为这5个新的花卉类别添加培训),以便将测试图像分类为1005个类

我正试图利用一个预先训练过的模型,如Inception v3(在2012 ImageNet数据集上训练),并将其扩展到几个缺失的类别中

我用Ubuntu14.04上的CUDA从源代码构建了TensorFlow,像flowers上的迁移学习这样的例子非常有效。然而,花卉示例去掉了最后一层并删除了所有1000个现有类别,这意味着它现在可以识别5种花卉,但不能再识别熊猫

如何将这5个花卉类别添加到ImageNet现有的1000个类别中(并为这5个新的花卉类别添加培训),以便将测试图像分类为1005个类别?换句话说,你能同时辨认出那些熊猫和向日葵吗

我知道有一种选择是下载整个ImageNet培训集和flowers示例集,然后从头开始培训,但考虑到我目前的计算能力,这将需要很长时间,并且不允许我再添加100个类别


我的一个想法是,在对5个花卉类别进行再培训时,将参数
fine_tune
设置为
false
,这样就不会剥离最后一层:,但我不确定如何继续,也不确定这是否会产生一个包含1005个类别的有效模型。感谢您的想法。

不幸的是,您无法将类别添加到现有图表中;基本上,您必须保存一个检查点,并从该检查点开始训练该图表。

经过几年的专业深入学习和工作,下面是一个更完整的答案:

向现有模型中添加类别的最佳方法(例如,在Imagenet LSVRC 1000类数据集上培训的Inception)是在预先培训的模型上执行转移学习

如果您只是想使模型适应您自己的数据集(例如,100种不同类型的汽车),只需按照大量的转移学习在线教程(包括Tensorflow的官方教程)进行再培训/微调即可

虽然生成的模型可能具有良好的性能,但请记住教程分类器代码是高度未优化的(可能是有意的),您可以通过部署到生产环境或仅改进其代码将性能提高几倍

但是,如果您试图构建一个包含默认LSVRC数据集(1000个日常图像类别)的通用分类器,并将其扩展以包含您自己的其他类别,则需要访问现有的1000个LSVRC图像并将您自己的数据集附加到该集。您可以在线下载Imagenet数据集,但随着时间的推移,访问变得越来越不稳定。在许多情况下,这些图像也非常过时(请查看计算机或手机的图像,以便在记忆通道中进行一次旅行)

一旦你有了LSVRC数据集,执行如上所述的转移学习,但包括1000个默认类别以及你自己的图像。对于您自己的图像,通常建议每个类别至少100张合适的图像(越多越好),如果启用扭曲,您可以获得更好的结果(但这将极大地增加再培训时间,特别是如果您没有启用GPU,因为瓶颈文件无法在每次失真时重复使用;我个人认为这是非常蹩脚的,没有理由不将失真缓存为瓶颈文件,但这是另一种讨论,可以添加到您的代码管理器中。)(精神上)

使用这些方法并结合错误分析,我们已经对4000多个类别的通用分类器进行了最先进的精度培训,并将其部署在数千万张图像上。此后,我们转向专有模型设计,以克服现有模型的局限性,但转移学习是获得良好r结果甚至通过BERT和其他设计进入了自然语言处理领域


希望这会有所帮助。

我们如何保存一个检查点并从该检查点开始训练该图形?