Python 如何使用Keras的深度学习模型解决不适合imagenet数据集的问题?

Python 如何使用Keras的深度学习模型解决不适合imagenet数据集的问题?,python,keras,deep-learning,transfer-learning,vgg-net,Python,Keras,Deep Learning,Transfer Learning,Vgg Net,我关注了一篇关于如何从头开始实现vgg16模型的博客,并希望对来自Keras的预训练模型也这样做。我查阅了其他一些博客,但我认为找不到合适的解决方案。我的任务是将集成电路图像分为缺陷图像和非缺陷图像 我在一篇论文中看到,他们使用vgg16的预训练imagenet模型进行织物缺陷检测,他们冻结了前七层,并针对自己的问题对后九层进行了微调。 (来源:) 我已经看到了关于如何冻结除完全连接层以外的所有层的示例,但是我如何尝试冻结前x层并针对我的问题微调其他层的示例 VGG16很容易从头开始实现,但是对

我关注了一篇关于如何从头开始实现vgg16模型的博客,并希望对来自Keras的预训练模型也这样做。我查阅了其他一些博客,但我认为找不到合适的解决方案。我的任务是将集成电路图像分为缺陷图像和非缺陷图像

我在一篇论文中看到,他们使用vgg16的预训练imagenet模型进行织物缺陷检测,他们冻结了前七层,并针对自己的问题对后九层进行了微调。 (来源:)

我已经看到了关于如何冻结除完全连接层以外的所有层的示例,但是我如何尝试冻结前x层并针对我的问题微调其他层的示例


VGG16很容易从头开始实现,但是对于诸如resnet或Exception之类的模型来说,它变得有点棘手。

没有必要从头开始实现一个模型来冻结几个层。您也可以在预先训练的模型上执行此操作。在keras中,您将使用
trainable=False

例如,假设您想要使用来自keras的预先训练的异常模型,并想要冻结第一个x层:

#In your includes
from keras.applications import Xception

#Since you're using the model for a different task, you'd want to remove the top
base_model = Xception(weights='imagenet', include_top=False)

#Freeze layers 0 to x
for layer in base_model.layers[0:x]:
    layer.trainable = False

#To see all the layers in detail and to check trainable parameters
base_model.summary()
理想情况下,您希望在该模型的顶部添加另一层,并将输出作为类。有关更多详细信息,您可以查看本keras指南:

很多时候,预先训练的权重在其他分类任务中非常有用,但如果您想在数据集上从头开始训练模型,则可以在不使用imagenet权重的情况下加载模型。或者更好,加载权重,但不要冻结任何层。这将以imagenet weights作为初始化,重新训练每一层


希望我已经回答了你的问题。

谢谢你的回答!我可以从ImageDataGenerator的目录使用flow_吗?我现在明白了如何冻结,但是完整的代码会是什么样子?我是否从ImageDataGenerator的_目录加载带有流_的图像,然后像您那样加载模型,不冻结任何层,然后使用adam之类的优化器进行编译?是的,这是一般的流。您可以使用\u目录中的flow\u来加载数据。加载预训练模型后,可以冻结/解冻几个层,并在输出处添加完全连接的层/softmax。然后编译你的模型并使用fit函数来训练itI我试过了,它成功了,但不太像intendet ^^我得到了非常高的val acc和非常低的val损失,但它将所有测试图像误分类为缺陷O_O我问了一个新问题,你猜到原因是什么吗?我使用了致密层和softmax,但不知道我是否做错了什么