结合两个预训练模型,使用2个不同类别(数据集)进行预测

2024-06-01 03:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个预先培训和保存的初始模型。在

模型1=具有Imagenet类的初始模型-它可以预测1000个类中的图像。在

模型2=具有我自己分类的初始模型(20个类)-它可以预测20个类中的图像。进行迁移学习并保存模型。在

我想结合这两者来预测1020个类的图像。在

Model1 = inception_v3.InceptionV3(weights='imagenet')

在1000个类中预测图像

^{pr2}$

我用自己的20个班进行了迁移学习。两个模型的输入形状相同。20个班预测图像

predictions = Model2.predict_classes(precessed_image)

我如何结合两个预先训练的初始模型来预测Imagenet类(1000个)和我自己的分类器(20个类)=预测1020个类上的图像?在

请给我你的解决方案与一个小片段(代码)为例,以便更好地理解。我对Keras很陌生。在


Tags: 模型图像分类v3形状imagenetinceptionmodel1
2条回答

您希望将预先训练的模型标签与您自己的标签结合起来,或者换句话说,您正在用新的类来扩充预先训练的模型。实践的方法是运用迁移学习的基础。在

但让我告诉你,这仍然是一个热门的研究课题。使用自己的类进行再培训比添加其他类更容易。难,不是不可能!在

你应该做的是:一种方法是改变最后一个softmax层来标识比它设计的标签更多的类。网络手术。你必须再次训练这个模型,这需要更多的时间。在

另一种方法是使用所有1020个标签创建一个新的自定义模型,并在整个数据集上对其进行训练,这不是很有效,而且您无法利用预训练模型中的权重,因此您必须再次执行完整的训练。在

黑客可以使用已经预测1000个类的检查点。为新类添加数据。现在,您应该将新类的数据与Imagenet数据集结合起来,为所有1020个类创建TFRecords,并从网络检查点进行训练。在

你要做的就是“学而不忘”。有关如何实现这一点的更多信息,请参阅下面的文章。在

https://arxiv.org/abs/1606.09282

这里有matlab代码。在

https://github.com/lizhitwo/LearningWithoutForgetting

你也可以尝试调整下面的文件来获得想要的结果。在

https://github.com/tensorflow/hub/blob/master/examples/image_retraining/retrain.py

另外, 要获得更多关于使用预训练模型进行再培训的信息,请参阅下面的链接。在

https://www.tensorflow.org/tutorials/images/hub_with_keras

现在来回答这个问题

我们如何做到:

在最终分类层中用增加的标签数量重建相同的模型,然后从预训练的inception V3恢复所有权重,除了最后一层,并微调模型。在

我们需要为此指定两个标志:

1.  pretrained_model_checkpoint_path
2.  fine_tune

代码看起来像这样。在

^{pr2}$

有关详细信息,请参阅以下文档。在

https://github.com/tensorflow/models/tree/master/research/inception

这里没有正确的答案。例如,您可以通过两个分类器运行图像,看看谁的最佳预测具有更高的可信度。另一个选择是创建一个简单的分类器,通过它你可以运行你的图像,它的预测是二进制的,并告诉你要使用哪个模型(1-inception,0-your-model)。另一个选择是查看预测分布。例如,如果您通过分类器运行某个图像,如果图像中的对象不在这20个类中的任何一个,那么预测分布将大致均匀地分布在几个类之间,而没有一个类是突出的,所有这些类都或多或少具有相同的置信度。这通常意味着图像不在分类器的范围内-模型不知道将图像放在哪里,因为它以前没有看到过图像,所以它无法决定。在

编辑

假设model是一个简单的二元分类器,它对类1中的初始图像和{}类中模型的图像进行分类。然后你可以这样做:

# open image
img = Image.open(path_to_image)

if model.predict(img): # positive case (classifier classified img to class '1')
  prediction = inception_model.predict(img)
else: # negative case (classifier classified img to class '0')
  prediction = my_model.predict(img)

现在预测的结果是变量prediction。这里我使用了这个简单的分类器(model)来预测哪个模型将实际用于对图像进行分类(inception或您的模型)。使用了inception,prediction将是1000维向量,如果{}被使用,prediction将是20维向量。但这并不重要,因为不管向量大小如何,你都可以得到最高的预测值。在

相关问题 更多 >