【问题标题】:Transfer Learning twice两次迁移学习
【发布时间】:2024-12-16 05:15:02
【问题描述】:
我有一个非常小的数据集,因此找到了另一个非常相似的数据集,并首先在该数据集上对其进行了训练,但使用了预训练模型 (DEnsenet 121)。在训练这个初始模型之后,我现在想移除输出神经元并将其替换为最终模型头,在加载模型权重之后,我如何移除最后一层并将其替换为另一个,并且仍然能够选择我可以选择的层冻结,我已经在谷歌搜索上尝试了我所看到的所有内容
【问题讨论】:
标签:
r
tensorflow
keras
deep-learning
【解决方案1】:
据我所知,您较少删除最后一层,而是使用您的第一个预训练模型的权重逐层重建模型。然后代替原来的最后一层,你可以随意使用任何层
【解决方案2】:
我不知道我是否正确,但您可以从 Keras 加载模型并将 include_top 变量设置为 False。有了这个,您可以“移除”顶部并添加您自己的密集层进行分类。也可以通过简单地将layer.trainable 组件设置为false(所以冻结它)来冻结或解冻层。
这是ResNet50 的简短示例:
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(self.img_height, self.img_width, 3))
# Freeze layers 0 to x
for layer in base_model.layers[0:-1]:
layer.trainable = False
"""for layer in base_model.layers[23:-1]:
layer.trainable = True"""
# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(1024, activation='relu')(x)
#x = Dropout(0.3)(x)
x = Dense(1024, activation='relu')(x)
#x = Dropout(0.3)(x)
# and a prediction Layer with number of classes and softmax function
predictions = Dense(2, activation='softmax')(x)
在 for 循环中,您可以设置要冻结哪些层以及要训练哪些层。之后,您可以在执行池化操作或任何您想做的事情后添加密集层。