【问题标题】:Hyperparameter optimization of transfer learning model with Keras Tuner使用 Keras Tuner 对迁移学习模型进行超参数优化
【发布时间】:2021-04-30 09:09:53
【问题描述】:

我想使用 Keras Tuner 对我的迁移学习模型执行超参数优化。我不知道该怎么做,因为我有两个训练阶段,

  1. 冻结整个网络,只训练最后一层以收敛到新的类并
  2. 解冻并训练网络。

this paperthis paper 中,提出了一种在使用迁移学习时进行超参数优化的方法,称为共享超参数优化。他们指出,在两个阶段之间共享一组超参数会导致最好的结果。但是,我不明白“一组超参数”的具体含义以及是否可以使用 Keras Tuner(他们使用 GPyOpt)来实现这一点。

对于理解此概念的任何帮助或有关如何为迁移学习模型执行超参数优化的任何其他想法/经验,我们将不胜感激!

【问题讨论】:

    标签: hyperparameters transfer-learning keras-tuner


    【解决方案1】:

    如果您不发布模型代码,我无法确定,但在我的情况下,我需要调整的大多数超参数都在模型的输出层中,并且 base_model 是 InceptionResNetv2。你可以在这里看到:

    def build_model(hp):
      METRICS = [
        'accuracy',
        tf.keras.metrics.AUC(name='auc'),
        tf.keras.metrics.Precision(name='precision'),
        tf.keras.metrics.Recall(name='recall')
      ]
      inputs = tf.keras.Input(shape=(512,512,3))
      base_model = InceptionResNetV2(include_top=False, weights='imagenet', input_shape=(512,512,3), input_tensor=inputs)
      base_model.trainable = False
      target_conv_layer = list(filter(lambda x: isinstance(x, tf.keras.layers.Conv2D), base_model.layers))[-1].name
      conv_layer = base_model.get_layer(target_conv_layer)
      x = GlobalAveragePooling2D()(conv_layer.output)
      x = tf.keras.layers.GaussianNoise(hp.Float("gn", min_value=0.3, max_value=0.6, step=0.1))(x)
      x = Dense(units=hp.Int("units", min_value=128, max_value=512, step=32), activation="relu", kernel_regularizer="l1")(x)
      x = Dropout(hp.Float("dropout", min_value=0.1, max_value=0.6, step=0.1))(x)
      predictions = Dense(3, activation="softmax")(x)
    
      model = Model(inputs=inputs, outputs=predictions)
    
      lr = hp.Float("lr", min_value=0.0001, max_value=0.01, sampling="log")
      model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = lr),
                    loss=tf.keras.losses.CategoricalCrossentropy(),
                    metrics=[METRICS])
    
      return model
    
    

    因此,您可以将此功能与 keras-tuner 一起使用,以收集模型的最佳超参数,因为输出层已使用您的数据集进行训练,并将学习如何对卷积输出中的图像进行分类。

    然后您可以继续使用这些超参数进行微调,据我了解,这些超参数将是“一组超参数”。

    如果您想进一步调整超参数,您可以使用您找到的当前超参数保存整个模型,然后定义一个新的 build_model 函数,该函数加载到模型中并设置模型以进行微调。这对我有用 - 但是我不确定这是否是最好的方法。新的 build_model 函数看起来像:

    
    def build_model(hp):
     model = tf.keras.models.load_model("your_model")
     model.trainable = True
    
     for layer in model.layers[:100]:
      layer.trainable = False
     
     lr = hp.Float("lr", min_value=0.0001, max_value=0.01, sampling="log")
     model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = learning_rate),loss=tf.keras.losses.CategoricalCrossentropy(),metrics=[METRICS])
     
    
    
    
    
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2021-07-18
      • 2017-09-17
      • 2020-02-11
      • 2019-03-31
      • 2020-10-22
      • 2023-01-31
      • 2017-12-21
      相关资源
      最近更新 更多