如何绘制TensorFlow Keras模型的训练与验证准确率、损失曲线?
实现方法
Keras的model.fit()返回的History对象会自动记录每一轮训练的训练集、验证集损失,以及你在compile阶段指定的所有评估指标,所有数据存在history.history字典结构中,你不需要修改现有编译、训练、评估的代码,直接基于这个字典调用matplotlib就能画出需要的曲线。
针对你当前写的二分类模型代码,history.history里默认存了4组核心数据:
loss:逐轮训练集损失值accuracy:逐轮训练集分类准确率val_loss:逐轮验证集损失值val_accuracy:逐轮验证集分类准确率
绘图代码
先确保环境装了matplotlib,执行命令安装:pip install matplotlib
直接在你现有训练代码(即history = model.fit(...))之后添加以下代码即可:
import matplotlib.pyplot as plt # 从history中提取绘图数据 train_loss = history.history['loss'] val_loss = history.history['val_loss'] train_acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] epoch_range = range(1, len(train_loss) + 1) # 创建1行2列的画布,分别放损失曲线、准确率曲线 plt.figure(figsize=(12, 5)) # 绘制损失子图 plt.subplot(1, 2, 1) plt.plot(epoch_range, train_loss, 'b-', label='Training Loss') plt.plot(epoch_range, val_loss, 'r-', label='Validation Loss') plt.title('Training and Validation Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.grid(alpha=0.3) # 绘制准确率子图 plt.subplot(1, 2, 2) plt.plot(epoch_range, train_acc, 'b-', label='Training Accuracy') plt.plot(epoch_range, val_acc, 'orange', label='Validation Accuracy') plt.title('Training and Validation Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.grid(alpha=0.3) # 自动调整子图间距,渲染展示 plt.tight_layout() plt.show()
如果需要把曲线图保存到本地,在plt.show()之前加一行代码即可:plt.savefig('train_val_curve.png', dpi=300, bbox_inches='tight')
补充说明
- 如果你后续在
model.compile()的metrics参数里新增其他评估指标(比如AUC、精确率、召回率),验证集对应的指标键名只需要在训练集指标名前加val_前缀即可,比如训练集AUC的键是auc,验证集AUC的键就是val_auc,提取逻辑和准确率完全一致。 - 如果你不用
validation_split拆分内部验证集,而是在model.fit()里传入自定义的验证集validation_data=(X_val, y_val),history的记录逻辑不变,上面的绘图代码不需要做任何修改。 - 你可以直接通过输出的曲线判断训练状态:如果验证集损失持续下降、准确率持续上升,说明模型仍在收敛;如果验证集损失开始抬升、训练集损失持续下降,说明模型已经出现过拟合,可以考虑加早停机制终止训练。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

