此页面由 Cloud Translation API 翻译。
Switch to English

使用HParams仪表板进行超参数调整

在TensorFlow.org上查看 在Google Colab中运行 在GitHub上查看源代码

在构建机器学习模型时,您需要选择各种超参数 ,例如层中的辍学率或学习率。这些决策会影响模型指标,例如准确性。因此,机器学习工作流程中的一个重要步骤是为您的问题确定最佳的超参数,这通常涉及实验。此过程称为“超参数优化”或“超参数调整”。

TensorBoard中的HParams仪表板提供了多种工具,可帮助您确定最佳实验或最有希望的超参数集。

本教程将重点关注以下步骤:

  1. 实验设置和HParams摘要
  2. 适应TensorFlow运行以记录超参数和指标
  3. 开始运行并将它们全部记录在一个父目录下
  4. 在TensorBoard的HParams仪表板中可视化结果

首先安装TF 2.0并加载TensorBoard笔记本扩展:

 # Load the TensorBoard notebook extension
%load_ext tensorboard
 
 # Clear any logs from previous runs
!rm -rf ./logs/ 
 

导入TensorFlow和TensorBoard HParams插件:

 import tensorflow as tf
from tensorboard.plugins.hparams import api as hp
 

下载FashionMNIST数据集并对其进行缩放:

 fashion_mnist = tf.keras.datasets.fashion_mnist

(x_train, y_train),(x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
 
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

1.实验设置和HParams实验摘要

在模型中试验三个超参数:

  1. 第一密集层中的单元数
  2. 辍学层中的辍学率
  3. 优化器

列出要尝试的值,并将实验配置记录到TensorBoard。此步骤是可选的:您可以提供域信息以在UI中启用对超参数的更精确过滤,并且可以指定应显示哪些度量。

 HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))

METRIC_ACCURACY = 'accuracy'

with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
  hp.hparams_config(
    hparams=[HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER],
    metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],
  )
 

如果选择跳过此步骤,则可以在任何其他使用HParam值的地方使用字符串文字:例如, hparams['dropout']而不是hparams[HP_DROPOUT]

2.调整TensorFlow运行以记录超参数和指标

该模型将非常简单:两个密集层之间有一个辍学层。尽管不再对超参数进行硬编码,但训练代码看起来会很熟悉。相反,超参数在hparams字典中提供,并在整个训练功能中使用:

 def train_test_model(hparams):
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(hparams[HP_NUM_UNITS], activation=tf.nn.relu),
    tf.keras.layers.Dropout(hparams[HP_DROPOUT]),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax),
  ])
  model.compile(
      optimizer=hparams[HP_OPTIMIZER],
      loss='sparse_categorical_crossentropy',
      metrics=['accuracy'],
  )

  model.fit(x_train, y_train, epochs=1) # Run with 1 epoch to speed things up for demo purposes
  _, accuracy = model.evaluate(x_test, y_test)
  return accuracy
 

对于每次运行,请记录具有超参数和最终精度的hparams摘要:

 def run(run_dir, hparams):
  with tf.summary.create_file_writer(run_dir).as_default():
    hp.hparams(hparams)  # record the values used in this trial
    accuracy = train_test_model(hparams)
    tf.summary.scalar(METRIC_ACCURACY, accuracy, step=1)
 

在训练Keras模型时,您可以使用回调而不是直接编写这些回调:

 model.fit(
    ...,
    callbacks=[
        tf.keras.callbacks.TensorBoard(logdir),  # log metrics
        hp.KerasCallback(logdir, hparams),  # log hparams
    ],
)
 

3.启动运行并将它们全部记录在一个父目录下

现在,您可以尝试多个实验,以不同的超参数集训练每个实验。

为简单起见,请使用网格搜索:尝试使用离散参数的所有组合,以及仅实值参数的上限和下限。对于更复杂的场景,随机选择每个超参数值可能会更有效(这称为随机搜索)。有更高级的方法可以使用。

运行一些实验,这将需要几分钟:

 session_num = 0

for num_units in HP_NUM_UNITS.domain.values:
  for dropout_rate in (HP_DROPOUT.domain.min_value, HP_DROPOUT.domain.max_value):
    for optimizer in HP_OPTIMIZER.domain.values:
      hparams = {
          HP_NUM_UNITS: num_units,
          HP_DROPOUT: dropout_rate,
          HP_OPTIMIZER: optimizer,
      }
      run_name = "run-%d" % session_num
      print('--- Starting trial: %s' % run_name)
      print({h.name: hparams[h] for h in hparams})
      run('logs/hparam_tuning/' + run_name, hparams)
      session_num += 1

 
--- Starting trial: run-0
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 62us/sample - loss: 0.6872 - accuracy: 0.7564
10000/10000 [==============================] - 0s 35us/sample - loss: 0.4806 - accuracy: 0.8321
--- Starting trial: run-1
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9428 - accuracy: 0.6769
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6519 - accuracy: 0.7770
--- Starting trial: run-2
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 60us/sample - loss: 0.8158 - accuracy: 0.7078
10000/10000 [==============================] - 0s 36us/sample - loss: 0.5309 - accuracy: 0.8154
--- Starting trial: run-3
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 50us/sample - loss: 1.1465 - accuracy: 0.6019
10000/10000 [==============================] - 0s 36us/sample - loss: 0.7007 - accuracy: 0.7683
--- Starting trial: run-4
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 65us/sample - loss: 0.6178 - accuracy: 0.7849
10000/10000 [==============================] - 0s 38us/sample - loss: 0.4645 - accuracy: 0.8395
--- Starting trial: run-5
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 55us/sample - loss: 0.8989 - accuracy: 0.6896
10000/10000 [==============================] - 0s 37us/sample - loss: 0.6335 - accuracy: 0.7853
--- Starting trial: run-6
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 64us/sample - loss: 0.6404 - accuracy: 0.7782
10000/10000 [==============================] - 0s 37us/sample - loss: 0.4802 - accuracy: 0.8265
--- Starting trial: run-7
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9633 - accuracy: 0.6703
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6516 - accuracy: 0.7755

4.在TensorBoard的HParams插件中可视化结果

现在可以打开HParams仪表板。启动TensorBoard,然后单击顶部的“ HParams”。

 %tensorboard --logdir logs/hparam_tuning
 

仪表板的左窗格提供了在HParams仪表板中的所有视图中都处于活动状态的筛选功能:

  • 过滤哪些超参数/指标显示在仪表板上
  • 过滤哪些超参数/度量值显示在仪表板上
  • 筛选运行状态(运行,成功等)
  • 在表格视图中按超参数/指标排序
  • 要显示的会话组数(在进行许多实验时对性能有用)

HParams仪表板具有三个不同的视图,其中包含各种有用的信息:

  • 表视图列出了运行,其超参数及其度量。
  • 平行坐标视图将每个运行显示为一条穿过每个超参数和度量的轴的线。单击并在任何轴上拖动鼠标以标记一个区域,该区域将仅突出显示通过该区域的运行。这对于确定哪些超参数组最重要是有用的。轴本身可以通过拖动来重新排序。
  • 散点图视图显示将每个超参数/度量与每个度量进行比较的图。这可以帮助识别相关性。单击并拖动以选择特定图中的区域,并突出显示其他图中的这些会话。

可以单击表格行,平行坐标线和散点图市场,以查看作为该会话训练步骤的函数的指标图(尽管在本教程中,每次运行仅使用一个步骤)。

要进一步探索HParams仪表板的功能,请下载一组带有更多实验的预生成日志:

 %%bash
wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'
unzip -q hparams_demo_logs.zip -d logs/hparam_demo
 

在TensorBoard中查看以下日志:

 %tensorboard --logdir logs/hparam_demo
 

您可以在HParams仪表板中尝试不同的视图。

例如,通过转到平行坐标视图并在精度轴上单击并拖动,可以选择精度最高的行程。当这些运行在优化程序轴上通过“ adam”时,您可以得出结论,在这些实验中,“ adam”的性能优于“ sgd”。