繁体   English   中英

使用自定义度量函数将keras配置保存到JSON

[英]Saving keras configuration with custom metric function to JSON

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

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

在这里,我读到可以通过custom_metric_name = mean_pred.__name__将函数名称作为字符串。 我希望不仅能够保存名称,而且能够在可能的情况下保存对该功能的引用。

也许我应该像这里提到的那样考虑不只是将我的配置存储在.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))

非常感谢这个问题的帮助以及以尽可能最好的方式保存配置的其他方法。

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

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM