具有 tf.keras 的 Hparams 插件(tensorflow 2.0)
Hparams plugin with tf.keras (tensorflow 2.0)
我尝试按照 tensorflow docs 中的示例并设置超参数日志记录。它还提到,如果你使用 tf.keras
,你可以只使用回调 hp.KerasCallback(logdir, hparams)
。但是,如果我使用回调,我不会得到我的指标(只有结果)。
我成功了,但不完全确定神奇的词是什么。这是我的流程以防有帮助。
callbacks.append(hp.KerasCallback(log_dir, hparams))
HP_NUM_LATENT = hp.HParam('num_latent_dim', hp.Discrete([2, 5, 100]))
hparams = {
HP_NUM_LATENT: num_latent,
}
model = create_simple_model(latent_dim=hparams[HP_NUM_LATENT]) # returns compiled model
model.fit(x, y, validation_data=validation_data,
epochs=4,
verbose=2,
callbacks=callbacks)
诀窍是使用 TensorBoard 保存其验证日志的路径定义 Hparams 配置。
因此,如果您的 TensorBoard 回调设置为:
log_dir = 'path/to/training-logs'
tensorboard_cb = TensorBoard(log_dir=log_dir)
那么你应该像这样设置 Hparams:
hparams_dir = os.path.join(log_dir, 'validation')
with tf.summary.create_file_writer(hparams_dir).as_default():
hp.hparams_config(
hparams=HPARAMS,
metrics=[hp.Metric('epoch_accuracy')] # metric saved by tensorboard_cb
)
hparams_cb = hp.KerasCallback(
writer=hparams_dir,
hparams=HPARAMS
)
我只是想补充一下以前的答案。如果您在 Colab 上的笔记本中使用 TensorBoard,问题可能不是您的代码引起的,而是由于 TensorBoard 在 Colab 上的 运行 方式。解决方案是杀死现有的 TensorBoard 并重新启动它。
如有错误请指正。
示例代码:
from tensorboard.plugins.hparams import api as hp
HP_LR = hp.HParam('learning_rate', hp.Discrete([1e-4, 5e-4, 1e-3]))
HPARAMS = [HP_LR]
# this METRICS does not seem to have any effects in my example as
# hp uses epoch_accuracy and epoch_loss for both training and validation anyway.
METRICS = [hp.Metric('epoch_accuracy', group="validation", display_name='val_accuracy')]
# save the configuration
log_dir = '/content/logs/hparam_tuning'
with tf.summary.create_file_writer(log_dir).as_default():
hp.hparams_config(hparams=HPARAMS, metrics=METRICS)
def fitness_func(hparams, seed):
rng = random.Random(seed)
# here we build the model
model = tf.keras.Sequential(...)
model.compile(..., metrics=['accuracy']) # need to pass the metric of interest
# set up callbacks
_log_dir = os.path.join(log_dir, seed)
tb_callbacks = tf.keras.callbacks.TensorBoard(_log_dir) # log metrics
hp_callbacks = hp.KerasCallback(_log_dir, hparams) # log hparams
# fit the model
history = model.fit(
..., validation_data=(x_te, y_te), callbacks=[tb_callbacks, hp_callbacks])
rng = random.Random(0)
session_index = 0
# random search
num_session_groups = 4
sessions_per_group = 2
for group_index in range(num_session_groups):
hparams = {h: h.domain.sample_uniform(rng) for h in HPARAMS}
hparams_string = str(hparams)
for repeat_index in range(sessions_per_group):
session_id = str(session_index)
session_index += 1
fitness_func(hparams, session_id)
要检查是否存在任何现有的 TensorBoard 进程,运行 Colab 中的以下内容:
!ps ax | grep tensorboard
假设 TensorBoard 进程的 PID 是 5315。那么,
!kill 5315
和运行
# of course, replace the dir below with your log_dir
%tensorboard --logdir='/content/logs/hparam_tuning'
就我而言,在我如上所述重置 TensorBoard 后,它可以正确记录 model.compile
中指定的指标,即准确性。
因为这个我已经浪费了几个小时。我想补充一下 Julian 关于定义 hparams 配置的好话,你想用 hparams 记录的指标的标签,可能它在 hp.Metric(tag='epoch_accuracy', group='validation')
中的组应该与你捕获的指标之一相匹配凯拉斯model.fit(..., metrics=)
。见 hparams_demo 的一个很好的例子
我尝试按照 tensorflow docs 中的示例并设置超参数日志记录。它还提到,如果你使用 tf.keras
,你可以只使用回调 hp.KerasCallback(logdir, hparams)
。但是,如果我使用回调,我不会得到我的指标(只有结果)。
我成功了,但不完全确定神奇的词是什么。这是我的流程以防有帮助。
callbacks.append(hp.KerasCallback(log_dir, hparams))
HP_NUM_LATENT = hp.HParam('num_latent_dim', hp.Discrete([2, 5, 100]))
hparams = {
HP_NUM_LATENT: num_latent,
}
model = create_simple_model(latent_dim=hparams[HP_NUM_LATENT]) # returns compiled model
model.fit(x, y, validation_data=validation_data,
epochs=4,
verbose=2,
callbacks=callbacks)
诀窍是使用 TensorBoard 保存其验证日志的路径定义 Hparams 配置。
因此,如果您的 TensorBoard 回调设置为:
log_dir = 'path/to/training-logs'
tensorboard_cb = TensorBoard(log_dir=log_dir)
那么你应该像这样设置 Hparams:
hparams_dir = os.path.join(log_dir, 'validation')
with tf.summary.create_file_writer(hparams_dir).as_default():
hp.hparams_config(
hparams=HPARAMS,
metrics=[hp.Metric('epoch_accuracy')] # metric saved by tensorboard_cb
)
hparams_cb = hp.KerasCallback(
writer=hparams_dir,
hparams=HPARAMS
)
我只是想补充一下以前的答案。如果您在 Colab 上的笔记本中使用 TensorBoard,问题可能不是您的代码引起的,而是由于 TensorBoard 在 Colab 上的 运行 方式。解决方案是杀死现有的 TensorBoard 并重新启动它。
如有错误请指正。
示例代码:
from tensorboard.plugins.hparams import api as hp
HP_LR = hp.HParam('learning_rate', hp.Discrete([1e-4, 5e-4, 1e-3]))
HPARAMS = [HP_LR]
# this METRICS does not seem to have any effects in my example as
# hp uses epoch_accuracy and epoch_loss for both training and validation anyway.
METRICS = [hp.Metric('epoch_accuracy', group="validation", display_name='val_accuracy')]
# save the configuration
log_dir = '/content/logs/hparam_tuning'
with tf.summary.create_file_writer(log_dir).as_default():
hp.hparams_config(hparams=HPARAMS, metrics=METRICS)
def fitness_func(hparams, seed):
rng = random.Random(seed)
# here we build the model
model = tf.keras.Sequential(...)
model.compile(..., metrics=['accuracy']) # need to pass the metric of interest
# set up callbacks
_log_dir = os.path.join(log_dir, seed)
tb_callbacks = tf.keras.callbacks.TensorBoard(_log_dir) # log metrics
hp_callbacks = hp.KerasCallback(_log_dir, hparams) # log hparams
# fit the model
history = model.fit(
..., validation_data=(x_te, y_te), callbacks=[tb_callbacks, hp_callbacks])
rng = random.Random(0)
session_index = 0
# random search
num_session_groups = 4
sessions_per_group = 2
for group_index in range(num_session_groups):
hparams = {h: h.domain.sample_uniform(rng) for h in HPARAMS}
hparams_string = str(hparams)
for repeat_index in range(sessions_per_group):
session_id = str(session_index)
session_index += 1
fitness_func(hparams, session_id)
要检查是否存在任何现有的 TensorBoard 进程,运行 Colab 中的以下内容:
!ps ax | grep tensorboard
假设 TensorBoard 进程的 PID 是 5315。那么,
!kill 5315
和运行
# of course, replace the dir below with your log_dir
%tensorboard --logdir='/content/logs/hparam_tuning'
就我而言,在我如上所述重置 TensorBoard 后,它可以正确记录 model.compile
中指定的指标,即准确性。
因为这个我已经浪费了几个小时。我想补充一下 Julian 关于定义 hparams 配置的好话,你想用 hparams 记录的指标的标签,可能它在 hp.Metric(tag='epoch_accuracy', group='validation')
中的组应该与你捕获的指标之一相匹配凯拉斯model.fit(..., metrics=)
。见 hparams_demo 的一个很好的例子