使用自定义指标功能将keras配置保存到JSON

时间:2019-04-24 18:04:43

标签: python json keras

我正在尝试保存Keras模型的配置。我希望能够从文件中读取配置,以便能够重现培训。

在函数中实现自定义指标之前,我可以按照下面显示的方式进行操作,而无需使用mean_pred。现在,我遇到了问题TypeError: Object of type 'function' is not JSON serializable

Here我读到可以通过custom_metric_name = mean_pred.__name__以字符串形式获取函数名称。我不仅希望能够保存名称,而且还希望能够保存对函数的引用。

也许我应该提到here也考虑不仅将我的配置存储在.py文件中,还考虑使用ConfigObj。除非这可以解决我当前的问题,否则我将在稍后实现。

问题的最小工作示例:

import keras.backend as K
import json

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

config = {'epochs':500,
          'loss':{'class':'categorical_crossentropy'},
          'optimizer':'Adam',
          'metrics':{'class':['accuracy', mean_pred]}
          }

# Do the training etc...

config_filename = 'config.txt'
with open(config_filename, 'w') as f:
    f.write(json.dumps(config))

非常感谢您提供有关此问题的帮助以及以最佳方式保存我的配置的其他方法。

1 个答案:

答案 0 :(得分:0)

为解决我的问题,我将函数名称作为字符串保存在配置文件中,然后从字典中提取函数以将其用作模型中的指标。可以另外使用:'class':['accuracy', mean_pred.__name__]将函数名称另存为配置中的字符串。 对于多个自定义功能和度量标准的更多键(例如,在进行回归和分类时,为“ reg”(如“类”)定义度量标准)也是如此。

import keras.backend as K
import json
from collections import defaultdict

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)


config = {'epochs':500,
          'loss':{'class':'categorical_crossentropy'},
          'optimizer':'Adam',
          'metrics':{'class':['accuracy', 'mean_pred']}
          }


custom_metrics= {'mean_pred':mean_pred}

metrics = defaultdict(list)
for metric_type, metric_functions in config['metrics'].items():
    for function in metric_functions:
        if function in custom_metrics.keys():
            metrics[metric_type].append(custom_metrics[function])
        else:
            metrics[metric_type].append(function)

# Do the training, use metrics

config_filename = 'config.txt'
with open(config_filename, 'w') as f:
    f.write(json.dumps(config))