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

问题描述

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

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

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

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

标签: pythonkerasdeep-learningtransfer-learningvgg-net

解决方案


没有必要从头开始实现模型来冻结几层。您也可以在预训练模型上执行此操作。在 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 权重作为初始化。

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


推荐阅读