python - 如何使用 Keras 的深度学习模型解决不适合 imagenet 数据集的问题?
问题描述
我关注了一篇关于如何从头开始实现 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 权重作为初始化。
我希望我已经回答了你的问题。
推荐阅读
- c# - {得到的目的;放}
- sql - 选择/更新最后输入的 sql 行
- python - pdfplumber在线处理pdf
- react-navigation - 世博项目不同步
- node.js - JWT(Json Web Token)的过期保存在哪里?
- flutter - 如何在 Flutter 中显示另一个模态下方的模态?
- javascript - Javascript多维map和reduce函数
- json - 使用 Express 从 URL 获取 JSON 对象
- php - 未捕获的 ArgumentCountError:函数 Posts::AddPost() 的参数太少
- python - 比较两个 2D numpy 数组并删除行