对于使用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要求为整个搜索定义一次回调,而不是每次试用都不要执行。在这种情况下,如何定义每个试用版的唯一目录?
答案 0 :(得分:2)
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已安装,构建并运行[标准编译参数: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