将TensorBoard与Keras Tuner结合使用

时间:2019-12-11 21:19:41

标签: tensorboard tensorflow2.0 tf.keras

对于使用TF2构建的模型,在使用Keras Tuner完成的超参数搜索期间,我试图使用TensorBoard的日志数据时遇到了明显的循环依赖性。后者的典型设置需要在调谐器的search()方法中设置Tensorboard回调,该方法包装模型的fit()方法。

from kerastuner.tuners import RandomSearch
tuner = RandomSearch(build_model, #this method builds the model
             hyperparameters=hp, objective='val_accuracy')
tuner.search(x=train_x, y=train_y,
             validation_data=(val_x, val_y),
             callbacks=[tensorboard_cb]

在实践中,tensorboard_cb回调方法需要设置要记录数据的目录,并且该目录对于每个试验都必须是唯一的。一种常见的方法是通过基于当前时间戳命名目录来实现此目的,并使用以下代码。

log_dir = time.strftime('trial_%Y_%m_%d-%H_%M_%S')
tensorboard_cb = TensorBoard(log_dir)

在训练具有已知超参数的模型时有效。但是,在执行超参数搜索时,我必须在调用tuner.search()之前定义并指定TensorBoard回调。这是问题所在:tuner.search()将多次调用build_model(),并且每个试验都应具有自己的TensorBoard目录。理想情况下,定义log_dir可以在build_model()内部完成,但是Keras Tuner搜索API会强制TensorBoard在该函数之外进行定义。

TL; DR: TensorBoard通过回调获取数据,并且每个 trial 需要一个日志目录,但是Keras Tuner要求为整个搜索定义一次回调,而不是每次试用都不要执行。在这种情况下,如何定义每个试用版的唯一目录?

1 个答案:

答案 0 :(得分:2)

keras调谐器会为每次运行创建一个子目录(声明可能与版本有关)。

我想找到正确的版本组合非常重要。

这是在 jupyterlab 中对我有用的方法。

先决条件:

  1. 点子要求
    keras-tuner==1.0.1
    tensorboard==2.1.1
    tensorflow==2.1.0
    Keras==2.2.4
    jupyterlab==1.1.4

(2。)jupyterlab已安装,构建并运行[标准编译参数:production:minimize]

这是实际的代码。首先,我定义日志文件夹和回调

# run parameter
log_dir = "logs/" + datetime.datetime.now().strftime("%m%d-%H%M")

# training meta
stop_callback = EarlyStopping(
    monitor='loss', patience=1, verbose=0, mode='auto')

hist_callback = tf.keras.callbacks.TensorBoard(
    log_dir=log_dir,
    histogram_freq=1,
    embeddings_freq=1,
    write_graph=True,
    update_freq='batch')

print("log_dir", log_dir)

然后,我定义我的超模型,我不想透露。之后 我设置了超参数搜索

from kerastuner.tuners import Hyperband

hypermodel = get_my_hpyermodel()

tuner = Hyperband(
    hypermodel
    max_epochs=40,
    objective='loss',
    executions_per_trial=5,
    directory=log_dir,
    project_name='test'
)

然后执行

tuner.search(
    train_data,
    labels,
    epochs=10,
    validation_data=(val_data, val_labels),
    callbacks=[hist_callback],
    use_multiprocessing=True)

tuner.search_space_summary()

使用此代码的笔记本搜索足够的超级参数时,我控制了另一个笔记本中的丢失。由于tf V2张量板可以通过magic function

调用

单元格1

import tensorboard

单元2

%load_ext tensorboard

单元3

%tensorboard --logdir 'logs/'

Sitenote:由于我在docker容器中运行jupyterlab,因此我必须为tensorboard指定适当的地址和端口,并将其转发到dockerfile中。

结果对我来说真的是不可预测的...当我可以预期张量图中的直方图和分布时,我还不了解。 有些运行的加载时间似乎真的太长了...所以耐心

在标量下,我找到了以下匝数列表

“ logdir” /“ model_has” / execution [iter] / [train / validation]

例如 0101-1010 / bb7981e03d05b05106d8a35923353ec46570e4b6 / execution0 / train 0101-1010 / bb7981e03d05b05106d8a35923353ec46570e4b6 / execution0 / validation