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

时间:2016-05-25 04:21:18

标签: machine-learning tensorflow

我正在尝试使用预先训练过的模型,如Inception v3(在2012 ImageNet数据集上进行过培训),并将其扩展为几个缺失的类别。

我在Ubuntu 14.04上使用CUDA从源代码构建了TensorFlow,并且像花朵上的转移学习这样的例子非常有用。然而,鲜花示例去除了最后一层并删除了所有1,000个现有类别,这意味着它现在可以识别5种花,但不能再识别大熊猫。 https://www.tensorflow.org/versions/r0.8/how_tos/image_retraining/index.html

如何将5个花类别添加到ImageNet的现有1,000个类别中(并添加针对这5个新花类别的培训),以便我有1,005个类别,测试图像可以归类为?换句话说,能够识别那些大熊猫和向日葵吗?

我理解一个选项是下载整个ImageNet训练集和花朵示例集并从头开始训练,但鉴于我目前的计算能力,它需要很长时间,并且不允许我添加比方说,还有100多个类别。

我有一个想法是在使用5个花类重新训练时将参数fine_tune设置为false,以便最终图层不被剥离:https://github.com/tensorflow/models/blob/master/inception/README.md#how-to-retrain-a-trained-model-on-the-flowers-data,但我不是确定如何继续,并不确定这是否会导致有1,005个类别的有效模型。谢谢你的想法。

2 个答案:

答案 0 :(得分:4)

很遗憾,您无法向现有图表添加类别;你基本上必须保存一个检查点并从那个检查点开始训练该图表。

答案 1 :(得分:1)

经过多年的学习和从事深度学习的专业知识后,下面是一个更完整的答案:

向现有模型(例如,在Imagenet LSVRC 1000类数据集上训练过的Inception)添加类别的最好方法是对预先训练的模型进行转移学习。

如果您只是想使模型适应您自己的数据集(例如100种不同类型的汽车),只需遵循无数的在线学习转移学习指南(包括Tensorflow官方指南)进行重新训练/微调。 / p>

尽管生成的模型可能具有良好的性能,但请记住,教程分类器代码未经高度优化(也许是有意优化的),并且可以通过部署到生产环境或仅改进其代码来将性能提高数倍。 / p>

但是,如果您试图构建一个包含默认LSVRC数据集(每天图像的1000个类别)的通用分类器,并将其扩展为包含自己的其他类别,则需要访问现有的分类器1000个LSVRC图像,并将您自己的数据集附加到该集合。您可以在线下载Imagenet数据集,但是随着时间的流逝,访问变得越来越复杂。在许多情况下,这些图像也非常过时(请查看计算机或电话中的图像以了解内存不足的情况)。

一旦有了该LSVRC数据集,就可以执行上述转移学习,但要包括1000个默认类别以及您自己的图像。对于您自己的图像,通常建议每个类别至少100张合适的图像(越多越好),并且如果启用了失真,您可以获得更好的结果(但这会大大增加重新训练的时间,尤其是如果您没有已启用GPU作为瓶颈文件,无法针对每种失真重复使用;我个人认为这很la脚,也没有理由不能将失真也作为瓶颈文件进行缓存,但这是一个不同的讨论,可以手动将其添加到代码中)。

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

希望这会有所帮助。