【问题标题】: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 循环中,您可以设置要冻结哪些层以及要训练哪些层。之后,您可以在执行池化操作或任何您想做的事情后添加密集层。

      【讨论】: