如何在Keras模型中使用F1分数?

13

有些原因导致我在尝试指定Keras模型的f1得分时会收到错误消息:

model.compile(optimizer='adam', loss='mse', metrics=['accuracy', 'f1_score'])

我遇到了这个错误:

ValueError: Unknown metric function:f1_score

在我使用'model.compile'的同一文件中提供了'f1_score'函数,代码如下:

在提供了'f1_score'函数后,我可以这样使用:

def f1_score(y_true, y_pred):

    # Count positive samples.
    c1 = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    c2 = K.sum(K.round(K.clip(y_pred, 0, 1)))
    c3 = K.sum(K.round(K.clip(y_true, 0, 1)))

    # If there are no true samples, fix the F1 score at 0.
    if c3 == 0:
        return 0

    # How many selected items are relevant?
    precision = c1 / c2

    # How many relevant items are selected?
    recall = c1 / c3

    # Calculate f1_score
    f1_score = 2 * (precision * recall) / (precision + recall)
    return f1_score 

model.compile(optimizer='adam', loss='mse', metrics=['accuracy', f1_score])

模型编译正确,可以保存到文件中:

model.save(model_path) # works ok

然而,将它加载到另一个程序中:

from keras import models 
model = models.load_model(model_path)

执行时出现错误:

ValueError: Unknown metric function:f1_score

这次在同一文件中指定“f1_score”并没有帮助,Keras看不到它。出了什么问题?如何在Keras模型中使用F1得分?


1
你的示例代码中的 K 是什么? - PythonNut
3个回答

11

加载模型时,您需要将该度量作为custom_objects参数的一部分提供。

请尝试像这样操作:

from keras import models 
model = models.load_model(model_path, custom_objects= {'f1_score': f1_score})

f1_score 是您通过 compile 传递的函数。


1
为了让您的f1_score实现起来正常工作,我不得不在函数声明中交换y_truey_pred。 附言:对于那些问过的人:K = keras.backend

该函数需要以(y_true, y_pred)作为参数,并返回单个张量值。- 来自文档 - Anthony C

0

变更:

metrics=['accuracy', f1_score]

to:

metrics=[f1_score]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接