我关注了一篇关于如何从头开始实现vgg16-model的博客,我想用Keras的预训练模型来做同样的事情。我查了一些其他的博客,但我想找不到合适的解决方案。我的任务是将集成电路图像分为缺陷和非缺陷。
我在一篇论文中看到,他们使用vgg16的预训练imagenet模型进行织物缺陷检测,他们冻结了前七层,并针对自己的问题对后九层进行了微调。(来源:https://journals.sagepub.com/doi/full/10.1177/1558925019897396)
我已经看到了如何冻结除完全连接的层之外的所有层的示例,但我如何尝试冻结前x层的示例,并针对我的问题对其他层进行微调?
VGG16相当容易从头开始实现,但是对于像resnet或xception这样的模型,它变得有点棘手。
发布于 2020-07-15 15:53:27
没有必要从头开始实现一个模型来冻结几个层。你也可以在预先训练好的模型上做到这一点。在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权重作为初始化。
我希望我已经回答了你的问题。
https://stackoverflow.com/questions/62908265
复制相似问题