我有一个非常小的数据集,因此找到了另一个非常相似的数据集,并首先在那个数据集上对其进行了训练,但是使用了预先训练的模型(DEnsenet 121)。训练完初始模型后,我现在要删除输出神经元并将其替换为最终模型头,在加载模型权重之后,如何删除最后一层并替换为另一层,并且仍然可以选择我可以选择的那一层冻结,我已经尝试了所有我在Google搜索中看到的内容
答案 0 :(得分:0)
据我所知,您无需删除最后一层,而是使用第一个预训练模型的权重来逐层重建模型。然后,您可以根据需要使用任意一层,而不是原始的最后一层
答案 1 :(得分:0)
我不知道我是否正确,但是您可以从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循环中,您可以设置要冻结的层和要训练的层。之后,您可以在执行“池化”操作或您想要执行的任何操作后添加“密集层”。