在Tensorboard中组织运行

问题描述

我正在使用RNN建立概率预测模型,并希望在Tensorboard中记录具有不同参数的多次运行以进行评估和比较。我是Tensorboard的新手,无法真正提出组织跑步的好方法。我希望能够在Tensorboard中按参数值对它们进行排序,所以目前我正在使用这种相当笨拙的方法

tb = SummaryWriter(log_dir=f'runs/leakyrelu/cuda{cuda_id}/m_epochs{max_epochs}/lr{learning_rate}/'
                                f'bs{batch_size}/h_h{history_horizon}/f_h{forecast_horizon}/'
                                f'core_{core_net}/drop_fc{dropout_fc}/'
                                f'drop_core{dropout_core}')

在不创建长达一英里的文件名或目录的情况下,是否有任何明智的方法或惯例?

解决方法

似乎您正在使用多个参数进行HyperParameter调整。

在Tensorboard中记录此类运行的最佳方法是使用其HParams插件。

第一步:导入

{% for project_id,amount in data %}
    {{ project_id }} | {{ amount }}
{% endfor %}

然后,创建要为其尝试不同值的参数的Hparam对象,并创建摘要编写器。

第2步:创建Hparam对象和摘要编写器

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

您创建的对象将如下所示:

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')],)

第3步:创建用于培训和测试的功能

HP_NUM_UNITS
HParam(name='num_units',domain=IntInterval(16,32),display_name=None,description=None)

在此函数中,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

实际的字典如下:

{
   HParam Object 1: VALUE-FOR-THE-OBJECT,HParam Object 2: VALUE-FOR-THE-OBJECT,HParam Object 3: VALUE-FOR-THE-OBJECT,}

第4步:登录Tensorboard的功能。

{HParam(name='num_units',domain=Discrete([16,32]),description=None): 32,HParam(name='dropout',domain=RealInterval(0.1,0.2),description=None): 0.2,HParam(name='optimizer',domain=Discrete(['adam','sgd']),description=None): 'sgd'}

在这里,run_dir是每个单独运行的路径。

第5步:尝试其他参数:

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)

注意:num_units将采用2个值“ 16”和“ 32”,而不是16和32之间的每个值。

您的Tensorboard将如下所示: 表格视图:

table view

散点图视图:

Scatter plot view.

您还可以通过将回调的路径设置为run_dir将其与Keras中的Tensorboard回调结合使用。

例如:

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

如果您要记录自定义指标或除在compile方法中定义的准确性或损失以外的其他指标,上述步骤很好。

但是,如果您不想使用自定义指标或不想与摘要编写器等打交道,则可以使用Keras回调来简化该过程。 没有摘要编写者的带有回调的完整代码

def train_test_model(hparams,run_dir):
    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(),activation=tf.nn.softmax)
    ])
    model.compile(
        optimizer=hparams[HP_OPTIMIZER],metrics=['accuracy']
    )
    
    callbacks = [
        tf.keras.callbacks.TensorBoard(run_dir),]
    
    model.fit(x_train,epochs=10,callbacks = callbacks) # Run with 1 epoch to speed things up for demo purposes
    
    _,y_test)
    return accuracy

有用链接:

  1. Hyperparameter Tuning with the HParams Dashboard
  2. Hparams demo using all possible Hparam objects - Official Github Repo