问题描述
我正在使用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将如下所示: 表格视图:
散点图视图:
您还可以通过将回调的路径设置为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
有用链接: