tel*_*ark 11 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多个类别.
我的一个想法是将参数设置fine_tune为false在使用5个花类别进行再培训时使最终图层不被剥离:https://github.com/tensorflow/models/blob/master/inception/README.md#how-重新训练一个受过训练的模型在花上的数据,但我不知道如何继续,并且不确定这是否会导致一个有1,005个类别的有效模型.谢谢你的想法.
经过几年的专业深度学习学习和工作,这里有一个更完整的答案:
将类别添加到现有模型(例如在 Imagenet LSVRC 1000 类数据集上训练的 Inception)的最佳方法是在预训练模型上执行迁移学习。
如果您只是想使模型适应您自己的数据集(例如 100 种不同类型的汽车),只需按照无数在线迁移学习教程(包括 Tensorflow 的官方教程)执行重新训练/微调。
虽然生成的模型可能具有良好的性能,但请记住,教程分类器代码高度未优化(可能是故意的),您可以通过部署到生产环境或仅改进其代码来将性能提高数倍。
但是,如果您尝试构建包含默认 LSVRC 数据集(1000 个日常图像类别)的通用分类器,并将其扩展为包含您自己的其他类别,则需要访问现有的 1000 个 LSVRC 图像并将您自己的数据集附加到该集。您可以在线下载 Imagenet 数据集,但随着时间的推移,访问变得越来越多。在许多情况下,图像也非常过时(查看计算机或手机的图像以了解记忆中的旅程)。
拥有该 LSVRC 数据集后,执行上述迁移学习,但包括 1000 个默认类别以及您自己的图像。对于您自己的图像,通常建议每个类别至少 100 个合适的图像(越多越好),如果启用失真,您可以获得更好的结果(但这会大大增加再训练时间,特别是如果您没有启用 GPU 作为瓶颈文件不能重复用于每个失真;我个人认为这很蹩脚,没有理由不能将失真也缓存为瓶颈文件,但这是一个不同的讨论,可以手动添加到您的代码中)。
使用这些方法并结合错误分析,我们已经在 4000 多个类别上训练了通用分类器以达到最先进的准确性,并将它们部署在数千万张图像上。此后,我们转向专有模型设计以克服现有模型限制,但迁移学习是获得良好结果的高度合法的方式,甚至通过 BERT 和其他设计进入自然语言处理。
希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |