Keras - Precision 和 Recall 大于 1(多分类)

Posted

技术标签:

【中文标题】Keras - Precision 和 Recall 大于 1(多分类)【英文标题】:Keras - Precision and Recall is greater than 1 (Multi classification) 【发布时间】:2018-08-07 17:34:21 【问题描述】:

我正在使用 keras 中的 CNN 解决多分类问题。我的准确率和召回率总是超过 1,这根本没有任何意义。下面附上我的代码,我做错了什么?

def recall(y_true, y_pred):
     true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
     possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
     recall = true_positives / (possible_positives + K.epsilon())
     return recall

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy',recall,precision])

【问题讨论】:

在多类设置中,你如何计算真阳性和可能阳性。您是否明智地按标签执行此操作? 嗨 Vivek,感谢您回来。精确度和召回率分数被计算为批量平均。我刚刚注意到的另一件事是,我没有一次性对我的 10 个标签进行编码。我只是使用了 0-9 的数值。这也可能是问题吗? 【参考方案1】:

我能够弄清楚这一点。一旦您对所有分类标签进行一次性编码,上述代码就可以完美运行。此外,请确保您没有将 sparse_categorical_crossentropy 作为损失函数,而只需使用 categorical_crossentropy。

如果您希望在 Keras 中将分类值转换为 one-hot 编码值,您可以使用以下代码:

from keras.utils import to_categorical
y_train = to_categorical(y_train)

您必须执行上述操作的原因在 Keras 文档中有所说明:

"当使用 categorical_crossentropy 损失时,你的目标应该是分类格式(例如,如果你有 10 个类,每个样本的目标应该是一个全零的 10 维向量,除了对应索引处的 1到样本的类)。为了将整数目标转换为分类目标,您可以使用 Keras 实用程序 to_categorical"

【讨论】:

以上是关于Keras - Precision 和 Recall 大于 1(多分类)的主要内容,如果未能解决你的问题,请参考以下文章

Precision-Recall曲线或ROC曲线是不是可能是一条水平线?

深度学习目标检测之评价指标

绘制阈值(precision_recall 曲线)matplotlib/sklearn.metrics

如何在 Keras 中计算精度和召回率

使用 dlib 进行狗脸检测 - 需要有关改进 recal 的建议

keras recall