如何向 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 种花卉,但不能再识别 pandas,例如。 https://www.tensorflow.org/versions/r0.8/how_tos/image_retraining/index.html
如何将 5 个花卉类别添加到 ImageNet 中现有的 1,000 个类别(并为这 5 个新的花卉类别添加训练),以便我有 1,005 个类别可以将测试图像分类为?也就是说,pandas和向日葵都能认出来吗?
我知道一个选择是下载整个 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 个类别的有效模型。谢谢你的想法。
很遗憾,您无法将类别添加到现有图表;您基本上必须保存一个检查点并从该检查点开始训练该图。
经过多年的深度学习专业学习和工作,这里有一个更完整的答案:
向现有模型(例如,在 Imagenet LSVRC 1000-class 数据集上训练的 Inception)添加类别的最佳方法是在预训练模型上执行迁移学习。
如果您只是想让模型适应您自己的数据集(例如 100 种不同的汽车),只需按照无数在线迁移学习教程(包括官方教程)执行 retraining/fine 调优对于 Tensorflow。
虽然生成的模型可能具有良好的性能,但请记住,教程 classifier 代码是高度未优化的(可能是有意的),您可以通过部署到生产中将性能提高数倍或者只是改进他们的代码。
但是,如果您尝试构建一个包含默认 LSVRC 数据集(1000 个日常图像类别)的通用 classifier 并将其扩展为包含您自己的其他类别,您将需要访问现有的 1000 个 LSVRC 图像并将您自己的数据集附加到该集。您可以在线下载 Imagenet 数据集,但随着时间的推移,访问变得越来越不稳定。在许多情况下,图像也非常过时(查看计算机或手机的图像以了解记忆)。
获得 LSVRC 数据集后,执行上述迁移学习,但包括 1000 个默认类别以及您自己的图像。对于你自己的图像,一般建议每个类别至少有 100 张合适的图像(越多越好),如果你启用失真可以获得更好的结果(但这会显着增加重新训练时间,特别是如果你没有GPU 启用,因为瓶颈文件不能为每个失真重复使用;我个人认为这很蹩脚,没有理由不能将失真也缓存为瓶颈文件,但这是一个不同的讨论,可以手动添加到您的代码中).
使用这些方法并结合错误分析,我们已经在 4000 多个类别上训练了通用 classifier 以达到最先进的准确性,并将它们部署在数千万张图像上。此后,我们转向专有模型设计以克服现有模型的局限性,但迁移学习是获得良好结果的一种高度合法的方式,甚至已经通过 BERT 和其他设计进入自然语言处理。
希望这对您有所帮助。
我正在尝试使用像 Inception v3 这样的预训练模型(在 2012 ImageNet 数据集上训练)并在几个缺失的类别中扩展它。
我在 Ubuntu 14.04 上使用 CUDA 从源代码构建了 TensorFlow,并且像花上的迁移学习这样的例子工作得很好。然而,花卉示例剥离了最后一层并删除了所有 1,000 个现有类别,这意味着它现在可以识别 5 种花卉,但不能再识别 pandas,例如。 https://www.tensorflow.org/versions/r0.8/how_tos/image_retraining/index.html
如何将 5 个花卉类别添加到 ImageNet 中现有的 1,000 个类别(并为这 5 个新的花卉类别添加训练),以便我有 1,005 个类别可以将测试图像分类为?也就是说,pandas和向日葵都能认出来吗?
我知道一个选择是下载整个 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 个类别的有效模型。谢谢你的想法。
很遗憾,您无法将类别添加到现有图表;您基本上必须保存一个检查点并从该检查点开始训练该图。
经过多年的深度学习专业学习和工作,这里有一个更完整的答案:
向现有模型(例如,在 Imagenet LSVRC 1000-class 数据集上训练的 Inception)添加类别的最佳方法是在预训练模型上执行迁移学习。
如果您只是想让模型适应您自己的数据集(例如 100 种不同的汽车),只需按照无数在线迁移学习教程(包括官方教程)执行 retraining/fine 调优对于 Tensorflow。
虽然生成的模型可能具有良好的性能,但请记住,教程 classifier 代码是高度未优化的(可能是有意的),您可以通过部署到生产中将性能提高数倍或者只是改进他们的代码。
但是,如果您尝试构建一个包含默认 LSVRC 数据集(1000 个日常图像类别)的通用 classifier 并将其扩展为包含您自己的其他类别,您将需要访问现有的 1000 个 LSVRC 图像并将您自己的数据集附加到该集。您可以在线下载 Imagenet 数据集,但随着时间的推移,访问变得越来越不稳定。在许多情况下,图像也非常过时(查看计算机或手机的图像以了解记忆)。
获得 LSVRC 数据集后,执行上述迁移学习,但包括 1000 个默认类别以及您自己的图像。对于你自己的图像,一般建议每个类别至少有 100 张合适的图像(越多越好),如果你启用失真可以获得更好的结果(但这会显着增加重新训练时间,特别是如果你没有GPU 启用,因为瓶颈文件不能为每个失真重复使用;我个人认为这很蹩脚,没有理由不能将失真也缓存为瓶颈文件,但这是一个不同的讨论,可以手动添加到您的代码中).
使用这些方法并结合错误分析,我们已经在 4000 多个类别上训练了通用 classifier 以达到最先进的准确性,并将它们部署在数千万张图像上。此后,我们转向专有模型设计以克服现有模型的局限性,但迁移学习是获得良好结果的一种高度合法的方式,甚至已经通过 BERT 和其他设计进入自然语言处理。
希望这对您有所帮助。