我正在使用Keras TensorBoard回调.我想运行网格搜索并可视化张量板中每个模型的结果.问题是不同运行的所有结果合并在一起,损失情节是这样的混乱:
如何重命名每次运行以获得类似于此的内容:
这里是网格搜索的代码:
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())
jdehesa.. 5
我认为没有任何方法可以将“每次运行”参数传递给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,则可以考虑使用更好的pathlib
模块进行路径和目录处理。
注意:我忘了提起它,但以防万一,请注意,传递write_graph=True
将记录每次运行的图形,这取决于您的模型,可能意味着很多(相对而言)该空间。同样适用于write_images
,尽管我不知道该功能所需的空间。
我认为没有任何方法可以将“每次运行”参数传递给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,则可以考虑使用更好的pathlib
模块进行路径和目录处理。
注意:我忘了提起它,但以防万一,请注意,传递write_graph=True
将记录每次运行的图形,这取决于您的模型,可能意味着很多(相对而言)该空间。同样适用于write_images
,尽管我不知道该功能所需的空间。