Keras模型指标相关疑问:编译阶段是否需预定义评估指标?
关于模型训练与评估阶段指标设置的问题解答
问题1:是否需要在编译阶段定义所有评估所需的指标?
不需要。编译阶段指定的metrics主要用于训练过程中实时监控模型表现,如果你只需要在训练完成后用测试集评估TP、TN、FP、FN等指标,完全没必要在编译阶段就把这些指标都加上。训练时只需要定义你关心的监控指标(比如仅CategoricalAccuracy)即可,避免训练过程中额外计算不必要的指标,节省计算资源。
问题2:model.evaluate()是否支持额外指定评估指标?
完全支持。model.evaluate()默认使用编译阶段定义的指标,但你可以通过调用时的metrics参数,额外指定任意需要的指标,实现“训练时仅监控accuracy,评估时再计算Recall、Precision等指标”的需求。
代码示例
训练阶段(仅监控准确率)
from tensorflow.keras.metrics import CategoricalAccuracy from tensorflow.keras.optimizers import Adam from tensorflow.keras.losses import CategoricalCrossentropy # 编译模型,仅指定训练时要监控的准确率 model.compile( optimizer=Adam(learning_rate=0.004), loss=CategoricalCrossentropy(from_logits=True), metrics=[CategoricalAccuracy(name="train_accuracy")] ) # 执行训练 model.fit(train_dataset, epochs=10, validation_data=val_dataset)
评估阶段(按需指定所有需要的指标)
from tensorflow.keras.metrics import ( Precision, Recall, TruePositives, TrueNegatives, FalseNegatives, FalsePositives, SensitivityAtSpecificity ) # 定义测试时需要计算的所有指标 eval_metrics = [ CategoricalAccuracy(name="test_accuracy"), Precision(name="precision"), Recall(name="recall"), TruePositives(name="tp"), TrueNegatives(name="tn"), FalseNegatives(name="fn"), FalsePositives(name="fp"), SensitivityAtSpecificity(0.5, name="sensitivity_at_0.5_spec") ] # 在测试集上评估,使用自定义的评估指标 test_loss, *test_metrics = model.evaluate(test_dataset, metrics=eval_metrics) # 打印结果 print(f"测试集损失: {test_loss:.4f}") print(f"测试集准确率: {test_metrics[0]:.4f}") print(f"精确率: {test_metrics[1]:.4f}") print(f"召回率: {test_metrics[2]:.4f}") print(f"真阳性(TP): {test_metrics[3]}") print(f"真阴性(TN): {test_metrics[4]}") print(f"假阴性(FN): {test_metrics[5]}") print(f"假阳性(FP): {test_metrics[6]}") print(f"特异性0.5时的敏感度: {test_metrics[7]:.4f}")
额外说明
- 对于多分类任务,部分指标(如
Precision、Recall)可以通过设置class_id参数,单独计算某一类的指标值,根据你的任务需求调整即可。 - 所有指标对象建议指定
name参数,方便后续识别结果对应的指标。
内容的提问来源于stack exchange,提问作者Marios Constantinou
相关产品推荐
相关产品推荐

