繁体   English   中英

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

[英]How do you add new categories and training to a pretrained Inception v3 model in 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#如何重新训练 - 训练模型 - 花卉数据 ,但我不知道如何继续,并不确定这是否会导致有1,005类别的有效模型。 谢谢你的想法。

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

经过多年的专业学习和深度学习,这里有一个更完整的答案:

向现有模型添加类别的最佳方法(例如,在Imagenet LSVRC 1000级数据集上训练的初始化)将在预训练模型上执行传递学习。

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

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

但是,如果您正在尝试构建包含默认LSVRC数据集(1000种日常图像)的通用分类器,并将其扩展为包含您自己的其他类别,则需要访问现有的1000 LSVRC图像并将您自己的数据集附加到该集合。 您可以在线下载Imagenet数据集,但随着时间的推移,访问变得越来越容易。 在许多情况下,图像也非常过时(检查计算机或手机的图像以便在记忆通道上行程)。

获得该LSVRC数据集后,执行上述传输学习,但包括1000个默认类别以及您自己的图像。 对于您自己的图像,通常建议每个类别至少100个适当的图像(越多越好),如果您启用扭曲,您可以获得更好的结果(但这会大大增加再训练时间,特别是如果您没有启用GPU作为瓶颈文件不能重复用于每个失真;我个人认为这是非常蹩脚的,没有理由为什么失真也不能被缓存为瓶颈文件,但这是一个不同的讨论,可以手动添加到你的代码)。

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

希望,这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM