使用Keras evaluate函数仅返回损失值,如何获取准确率?
解决Keras模型evaluate只返回损失值、无法获取准确率的问题
这个问题我之前也碰到过,核心原因很简单:你的模型在编译阶段没有指定要评估的准确率指标,所以evaluate函数默认只返回损失值这一个标量,自然用score[0]会报索引错误。下面给你两种清晰的解决思路:
方法一:重新编译模型(推荐)
Keras的evaluate返回的指标完全由你在compile时通过metrics参数定义,默认只有损失值。你只需要给模型重新添加准确率指标编译,再运行评估即可——放心,重新编译不会改变你已经训练好的权重。
步骤:
- 找到你当初编译模型的代码,根据任务类型修改成对应形式:
- 多分类任务(标签是one-hot编码):
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) - 多分类任务(标签是整数形式,比如0、1、2表示类别):
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy']) - 二分类任务:
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['binary_accuracy'])
- 多分类任务(标签是one-hot编码):
- 重新运行评估代码:
这时候score = model.evaluate(X_test, Y_test, verbose=0) print(f"测试损失值:{score[0]},测试准确率:{score[1]}")score就是一个包含两个元素的列表,第一个是损失,第二个是你指定的准确率。
方法二:手动计算准确率(无需重新编译)
如果你不想重新编译模型,也可以通过模型的预测结果手动计算准确率:
import numpy as np # 获取模型预测结果 predictions = model.predict(X_test, verbose=0) # 根据任务类型处理预测结果和真实标签 # 示例1:多分类(one-hot标签) predicted_classes = np.argmax(predictions, axis=1) true_classes = np.argmax(Y_test, axis=1) # 示例2:二分类 # predicted_classes = (predictions > 0.5).astype(int) # true_classes = Y_test.astype(int) # 计算准确率 accuracy = np.mean(predicted_classes == true_classes) print(f"测试准确率:{accuracy}")
注意事项
- 一定要根据任务类型选择对应的准确率指标,不然会出现计算错误或者指标不符合预期的情况。
- 如果你用的是
tf.keras(TensorFlow集成的Keras),语法和原生Keras完全一致,上面的方法同样适用。
内容的提问来源于stack exchange,提问作者Yasheel Vyas
相关产品推荐
相关产品推荐

