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

How to use Deep Learning Models from Keras for a problem that does not fit imagenet dataset?

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

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

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

VGG16 从头开始​​实施相当容易,但对于 resnet 或 xception 等模型,它变得有点棘手。

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

例如,假设您想使用来自 keras 的预训练 Xception 模型并想冻结前 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指南:https://keras.io/guides/transfer_learning/

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

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