如何在Keras Fit输出中命名自定义指标

时间:2019-09-12 16:06:45

标签: python keras

训练Keras模型时,我正在使用自定义指标。除model.fit_generator(...)输出中的度量标准名称不可解释外,它工作正常(注意:Tensorboard也使用这些错误的名称)。

这里是我正在做的事情的可重现示例:度量标准使用一个参数(除了预测和基本事实外),因此我定义了一个工厂来生成无参数度量标准函数,类似于:

def my_dummy_metric(y_true, y_pred, the_param=1.0):
    return the_param * keras.backend.ones((1))

def my_metric_factory(the_param=1.0):
    def fn(y_true, y_pred):
        return my_dummy_metric(y_true, y_pred, the_param=the_param)

    return fn

my_second_metric = my_metric_factory(2.0)
my_other_metric = my_metric_factory(3.14)

然后我编译并训练模型:

model.compile(my_optim, my_loss, [my_second_metric, my_other_metric])
history = model.fit_generator(...)
print(history.params['metrics'])

我的麻烦是history中的度量标准名称为fnfn_1val_fnval_fn_1。 Tensorboard也会使用这些名称,您需要了解这些隐含的详细信息才能理解它们。

相反,在没有工厂的情况下使用简单的自定义函数时,我没有这个问题:

model.compile(my_optim, my_loss, [my_dummy_metric])
history = model.fit_generator(...)
print(history.params['metrics'])

在基于工厂的用例中,是否有可能获得my_XXX_metric作为输出名称?

环境:使用Keras 2.2.4,TF 1.14.0,Python 3.7

2 个答案:

答案 0 :(得分:2)

如果有人使用TF 2.0或更高版本的默认指标(而非自定义指标),则可以按以下方式尝试在指标中使用name参数:

# Recall inherits Metric class and similarly name of most of the metrics could be changed
recall = tf.keras.metrics.Recall(name = 'custom_name')
model.compile(loss=..., optimizer=...,
                        metrics=[recall])
model.fit(...)

如果您想为诸如precision @ k,recall @ k,TopKCategoricalAccuracy之类的度量提供自定义名称,则可以遵循以下内容:

k = 5
precision = tf.keras.metrics.Precision(top_k=k, name = 'precision_' + str(k))
model.compile(loss=..., optimizer=...,
                        metrics=[recall])
model.fit(...)

资料来源:
1. https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall
2. https://www.tensorflow.org/api_docs/python/tf/keras/metrics

答案 1 :(得分:1)

是的,这是可能的。在度量标准工厂中,只需设置适当的度量标准函数__name__。例如:

def my_metric_factory(the_param=1.0):
    def fn(y_true, y_pred):
        return my_dummy_metric(y_true, y_pred, the_param=the_param)

    fn.__name__ = 'metricname_{}'.format(the_param)
    return fn