[tensorflow2.0]使用Keras Tune进行超参数调优

  Keras Tuner是一个库。Tuner 组件用于调节模型的超参数。为您的机器学习(ML)应用程序选择正确的超参数集的过程称为超参数调整或超调整。Tuner 组件广泛使用 Python KerasTuner API 来调节超参数。注:无论建模 API 如何,KerasTuner 库都可用于超参数调节,而不仅限于 Keras 模型。
  超参数是控制训练过程和ML模型的拓扑的变量。 这些变量在训练过程中保持不变,并直接影响ML程序的性能。 超参数有两种类型:

  • 模型超参数,例如隐藏层的数量和宽度
  • 算法超参数,例如随机梯度下降(SGD)的学习率以及k个最近邻(KNN)分类器的最近邻居数
    在本教程中,您将使用Keras Tuner对图像分类应用程序执行超调。

使用方法

  当构建用于调整超参数的模型时,除了模型架构之外,还要定义超参数搜索空间。 超调优设置的模型称为超模型。
  可以通过两种方法定义超模型:

  • 通过使用模型构建器功能
  • 通过子类化Keras Tuner API的HyperModel类

  此外,还可以将两个预定义的HyperModel类-HyperXception和HyperResNet用于计算机视觉应用程序。
  下面将使用模型构建器功能来定义图像分类模型。 模型构建器函数返回已编译的模型,并使用内联定义的超参数对模型进行超调。

def model_builder(hp):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))

  # 微调第一个隐藏层的神经节点数
  # 将搜索区间定义在[32, 512]内
  hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
  model.add(keras.layers.Dense(units = hp_units, activation = 'relu'))
  model.add(keras.layers.Dense(10))

  # 微调优化器opimizers的学习率lr 
  # lr的搜索区间为0.01, 0.001, 0.0001
  hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4]) 

  model.compile(optimizer = keras.optimizers.Adam(learning_rate = hp_learning_rate),
                loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True), 
                metrics = ['accuracy'])

  return model

实例化tuner并执行超参微调

  实例化tuner以执行超调参。 Keras Tuner有四个可用的调谐方法-RandomSearchHyperbandBayesianOptimizationSklearn。(顾名思义,随机调参,) 在本教程中,您将使用Hyperband调谐器。
  要实例化Hyperband调谐器,必须指定超模型,要优化的目标以及要训练的最大时期数( max_ epochs )。

tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = 10,
                     factor = 3,
                     directory = 'my_dir',
                     project_name = 'intro_to_kt')

  Hyperband算法使用自适应资源分配和提前停止来快速收敛到高性能模型上。 这是使用运动冠军风格的支架完成的。 该算法在几个时期内训练了大量模型,并且仅将性能最高的一半模型进行到下一轮。 Hyperband通过计算 1 + log ⁡ f a c t o r ( m a x e p o c h s ) 1+\log_{factor}(maxepochs) 1+logfactor(maxepochs) , 并将其四舍五入到最接近的整数来确定要在括号中训练的模型的数量。
  在运行超参数搜索之前,定义一个回调以在每个训练步骤结束时清除训练输出。

class ClearTrainingOutput(tf.keras.callbacks.Callback):
  def on_train_end(*args, **kwargs):
    IPython.display.clear_output(wait = True)

  进行超参数搜索。 除了上面的回调外,搜索方法的参数与tf.keras.model.fit所使用的参数相同。

tuner.search(img_train, label_train, epochs = 10, validation_data = (img_test, label_test), callbacks = [ClearTrainingOutput()])

# Get the optimal hyperparameters
best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]

print(f"""
The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is {best_hps.get('units')} and the optimal learning rate for the optimizer
is {best_hps.get('learning_rate')}.
""")

  最后,使用搜索出的最佳超参数重新训练模型。
  my_dir / intro_to_kt目录包含在超参数搜索期间运行的每个试验(模型配置)的详细日志和检查点。 如果重新运行超参数搜索,Keras Tuner将使用这些日志中的现有状态来继续搜索。 若要禁用此行为,请在实例化调谐器时传递一个额外的overwrite = True参数。

参考

  1. tensorflow2指南
  2. Tuner TFX 流水线组件

你可能感兴趣的:(tensorflow)