训练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
中的度量标准名称为fn
,fn_1
,val_fn
和val_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
答案 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