Python 如何使用Keras TensorBoard回调进行网格搜索
我正在使用Keras张力板回调。 我想运行网格搜索,并在tensor board中可视化每个模型的结果。 问题是,不同运行的所有结果都合并在一起,损失图是一团混乱,如下所示: 如何重命名每个跑步,使其具有类似于以下内容: 以下是网格搜索的代码:Python 如何使用Keras TensorBoard回调进行网格搜索,python,tensorflow,scikit-learn,keras,tensorboard,Python,Tensorflow,Scikit Learn,Keras,Tensorboard,我正在使用Keras张力板回调。 我想运行网格搜索,并在tensor board中可视化每个模型的结果。 问题是,不同运行的所有结果都合并在一起,损失图是一团混乱,如下所示: 如何重命名每个跑步,使其具有类似于以下内容: 以下是网格搜索的代码: df = pd.read_csv('data/prepared_example.csv') df = time_series.create_index(df, datetime_index='DATE', other_index_list=['IT
df = pd.read_csv('data/prepared_example.csv')
df = time_series.create_index(df, datetime_index='DATE', other_index_list=['ITEM', 'AREA'])
target = ['D']
attributes = ['S', 'C', 'D-10','D-9', 'D-8', 'D-7', 'D-6', 'D-5', 'D-4',
'D-3', 'D-2', 'D-1']
input_dim = len(attributes)
output_dim = len(target)
x = df[attributes]
y = df[target]
param_grid = {'epochs': [10, 20, 50],
'batch_size': [10],
'neurons': [[10, 10, 10]],
'dropout': [[0.0, 0.0], [0.2, 0.2]],
'lr': [0.1]}
estimator = KerasRegressor(build_fn=create_3_layers_model,
input_dim=input_dim, output_dim=output_dim)
tbCallBack = TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=False)
grid = GridSearchCV(estimator=estimator, param_grid=param_grid, n_jobs=-1, scoring=bug_fix_score,
cv=3, verbose=0, fit_params={'callbacks': [tbCallBack]})
grid_result = grid.fit(x.as_matrix(), y.as_matrix())
我认为没有任何方法可以将“每次运行”参数传递给
GridSearchCV
。也许最简单的方法是将KerasRegressor
子类化,以执行您想要的操作
class KerasRegressorTB(KerasRegressor):
def __init__(self, *args, **kwargs):
super(KerasRegressorTB, self).__init__(*args, **kwargs)
def fit(self, x, y, log_dir=None, **kwargs):
cbs = None
if log_dir is not None:
params = self.get_params()
conf = ",".join("{}={}".format(k, params[k])
for k in sorted(params))
conf_dir = os.path.join(log_dir, conf)
cbs = [TensorBoard(log_dir=conf_dir, histogram_freq=0,
write_graph=True, write_images=False)]
super(KerasRegressorTB, self).fit(x, y, callbacks=cbs, **kwargs)
你会像这样使用它:
# ...
estimator = KerasRegressorTB(build_fn=create_3_layers_model,
input_dim=input_dim, output_dim=output_dim)
#...
grid = GridSearchCV(estimator=estimator, param_grid=param_grid,
n_jobs=1, scoring=bug_fix_score,
cv=2, verbose=0, fit_params={'log_dir': './Graph'})
grid_result = grid.fit(x.as_matrix(), y.as_matrix())
更新:
由于GridSearchCV
由于交叉验证而多次运行同一模型(即相同的参数配置),因此前面的代码将在每次运行中放置多个跟踪。查看源代码(和),似乎没有检索“当前拆分id”的方法。同时,您不应该只检查现有文件夹并根据需要添加子像素,因为作业(至少可能是并行运行的,尽管我不确定Keras/TF是否是这样)。您可以尝试以下方法:
import itertools
import os
class KerasRegressorTB(KerasRegressor):
def __init__(self, *args, **kwargs):
super(KerasRegressorTB, self).__init__(*args, **kwargs)
def fit(self, x, y, log_dir=None, **kwargs):
cbs = None
if log_dir is not None:
# Make sure the base log directory exists
try:
os.makedirs(log_dir)
except OSError:
pass
params = self.get_params()
conf = ",".join("{}={}".format(k, params[k])
for k in sorted(params))
conf_dir_base = os.path.join(log_dir, conf)
# Find a new directory to place the logs
for i in itertools.count():
try:
conf_dir = "{}_split-{}".format(conf_dir_base, i)
os.makedirs(conf_dir)
break
except OSError:
pass
cbs = [TensorBoard(log_dir=conf_dir, histogram_freq=0,
write_graph=True, write_images=False)]
super(KerasRegressorTB, self).fit(x, y, callbacks=cbs, **kwargs)
我使用<代码> OS >代码>调用Python 2兼容,但是如果使用Python 3,则可以考虑路径和目录处理更好。
注意:我忘了在前面提到它,但为了以防万一,请注意传递
write\u graph=True
将记录每次运行的一个图,这取决于您的模型,可能意味着这个空间的很大一部分(相对而言)。这同样适用于write_images
,尽管我不知道该功能需要多少空间。很简单,只需将日志保存到单独的目录中,并使用串联参数字符串作为目录名称:
以下是使用日期作为运行名称的示例:
from datetime import datetime
datetime_str = ('{date:%Y-%m-%d-%H:%M:%S}'.format(date=datetime.now()))
callbacks = [
ModelCheckpoint(model_filepath, monitor='val_loss', save_best_only=True, verbose=0),
TensorBoard(log_dir='./logs/'+datetime_str, histogram_freq=0, write_graph=True, write_images=True),
]
history = model.fit_generator(
generator=generator.batch_generator(is_train=True),
epochs=config.N_EPOCHS,
steps_per_epoch=100,
validation_data=generator.batch_generator(is_train=False),
validation_steps=10,
verbose=1,
shuffle=False,
callbacks=callbacks)
谢谢你的详细建议。今天晚些时候我会试试,我会告诉你的。只需考虑一个问题:此解决方案是否会创建多个文件夹?在这种情况下,我是否能够在一个tensorboard中显示所有的运行,或者我必须运行它的多个实例?@paolof89是的,它确实会为每个实验创建一个目录,但事实上,您在tensorboard中看到的“运行”实际上只是包含日志信息的子文件夹。如果您在日志的根目录中打开TensorBoard(在示例
/Graph
),您将看到每个实验都有一个“运行”,所有这些都在一起,或者您可以在特定运行的目录中打开TensorBoard进行更仔细的查看。我测试了它,它可以工作,但还有最后一个问题。GridSearchCV实现了k折叠技术,因此在每个文件夹中都可以找到k图。最小k倍值是2,所以我的问题还没有解决。有什么想法吗?我会在keras github上发布一个问题,以防一些用户有同样的问题issue@paolof89我已经用可能的解决方案更新了答案。也可以使用datetime\u str=datetime.now().strftime(“%Y-%m-%d-%H-%m-%S”)
。基于:,可以自定义自己的时间字符串。