两次转移学习

时间:2020-08-31 06:15:53

标签: r tensorflow keras deep-learning

我有一个非常小的数据集,因此找到了另一个非常相似的数据集,并首先在那个数据集上对其进行了训练,但是使用了预先训练的模型(DEnsenet 121)。训练完初始模型后,我现在要删除输出神经元并将其替换为最终模型头,在加载模型权重之后,如何删除最后一层并替换为另一层,并且仍然可以选择我可以选择的那一层冻结,我已经尝试了所有我在Google搜索中看到的内容

2 个答案:

答案 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循环中,您可以设置要冻结的层和要训练的层。之后,您可以在执行“池化”操作或您想要执行的任何操作后添加“密集层”。