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