将 TensorBoard 与 Keras Tuner 一起使用
Posted
技术标签:
【中文标题】将 TensorBoard 与 Keras Tuner 一起使用【英文标题】:Use TensorBoard with Keras Tuner 【发布时间】:2020-04-05 05:38:08 【问题描述】:在使用Keras Tuner 完成的超参数搜索期间,我遇到了一个明显的循环依赖关系,试图使用 TensorBoard 的日志数据,用于使用 TF2 构建的模型。后者的典型设置需要在 Tuner 的 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 通过回调获取数据,每次试用需要一个日志目录,但 Keras Tuner 需要为整个搜索定义一次回调,在执行之前,而不是每次试验。在这种情况下如何定义每个试验的唯一目录?
【问题讨论】:
【参考方案1】:keras 调谐器为每次运行创建一个子目录(语句可能取决于版本)。
我想找到正确的版本组合很重要。
在 jupyterlab 中,这对我来说是这样的。
先决条件:
-
点子要求
keras-tuner==1.0.1
tensorboard==2.1.1
tensorflow==2.1.0
Keras==2.2.4
jupyterlab==1.1.4
(2.) 安装、构建和运行 jupyterlab [标准编译参数:生产:最小化]
这是实际代码。首先我定义了日志文件夹和回调
# 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()
当使用此代码的笔记本搜索足够的超参数时,我控制了另一个笔记本中的损失。由于可以通过magic function 调用 tf V2 tensorboard
单元格 1
import tensorboard
单元格 2
%load_ext tensorboard
细胞 3
%tensorboard --logdir 'logs/'
Sitenote:由于我在 docker 容器中运行 jupyterlab,因此我必须为 tensorboard 指定适当的地址和端口,并将其转发到 dockerfile 中。
结果对我来说真的无法预测......我还不明白,什么时候我可以期待 tensorboard 中的直方图和分布。 有些运行加载时间似乎真的很长......所以有耐心
在标量下,我找到如下的转弯列表
"logdir"/"model_has"/execution[iter]/[train/validation]
例如 0101-1010/bb7981e03d05b05106d8a35923353ec46570e4b6/execution0/train 0101-1010/bb7981e03d05b05106d8a35923353ec46570e4b6/execution0/验证
【讨论】:
以上是关于将 TensorBoard 与 Keras Tuner 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
我可以通过 Keras 将图像添加到 Tensorboard 吗?
使用 tf.keras.Model.fit 进行训练时如何将自定义摘要添加到 tensorboard