Keras - 精度和召回大于1(多重分类)

时间:2018-02-27 23:05:20

标签: python machine-learning keras classification precision-recall

我正在研究在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])

1 个答案:

答案 0 :(得分:2)

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

如果您希望将分类值转换为Keras中的单热编码值,则可以使用此代码:

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

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

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