我很困惑。我的目标是用F1 Score训练我的CNN模型。然而,结果很奇怪
import tensorflow_addons as tfa
import numpy as np
metric = tfa.metrics.F1Score(
num_classes=4, threshold=0.5)
y_true = np.array([
[0, 1, 0, 0],
# [0, 1, 0, 0],
# [1, 0, 0, 0]
], np.int32)
y_pred = np.array([
[0, 1, 0, 0],
# [0.2, 0.6, 0.2, 0.2],
# [0.6, 0.2, 0.2, 0.2]
], np.float32)
metric.update_state(y_true, y_pred)
result = metric.result()
result.numpy()
预期结果为
[1,1,1,1]
因此,当我想获得宏F1 Score时,它应该是1
而不是0.25
。
实际结果是
[0, 1, 0, 0]
因此,当我使用参数average=macro
时,实际结果是0.25
。
编辑:
我很困惑。我添加另一行y_true
,它的工作。我希望它抛出错误,但它没有。
import tensorflow_addons as tfa
import numpy as np
metric = tfa.metrics.F1Score(
num_classes=4, threshold=0.5)
y_true = np.array([
[0, 1, 0, 0],
[1, 0, 0, 0]
# [0, 1, 0, 0],
# [1, 0, 0, 0]
], np.int32)
y_pred = np.array([
[0, 1, 0, 0],
# [0.2, 0.6, 0.2, 0.2],
# [0.6, 0.2, 0.2, 0.2]
], np.float32)
metric.update_state(y_true, y_pred)
result = metric.result()
result.numpy()
tensorflow插件有bug吗?
tfa.metrics.F1Score
没有问题。您已经定义了4个类,y_pred
行的每个元素表示类的概率,如果超过阈值则为1,然后计算F1分数。在你的第一个例子中,没有输出表示类0,2,3,这就是为什么它们是零。
检查下面的例子,
y_true = np.array([
[0, 1, 1, 0],
[0, 0, 0, 1],
[1, 0, 1, 0],
y_pred = np.array([
[0, 1, 0, 0],
[0, 1, 0, 0],
[0.6, 0, 0.51, 0],
#metrics.F1Score
[1. , 0.6666667, 0.6666667, 0. ]