Keras训练数据绘图显示空图问题排查
问题原因及解决方案
我来帮你分析下为什么绘图为空,主要有这几个关键点:
1. 历史记录被重复覆盖
你在50次循环里每次都把model.fit()的结果赋值给同一个history变量,这意味着最后你只保留了第50次训练的历史数据。而每次训练只跑1个epoch,所以history.history['acc']里只有一个数值——绘图时只有单个数据点,matplotlib默认不会显示线条,单点如果和背景颜色接近,看起来就像空图。
2. Early Stopping可能提前终止训练
如果你的early_stop回调设置得比较严格(比如监测loss且patience=0),或者你的小数据集(仅10条样本)让模型瞬间就拟合完成,那每次fit()可能根本没跑完1个epoch就停止了,甚至history里的acc数据可能为空或者只有初始值,自然绘不出内容。
3. 绘图代码和训练逻辑不匹配
你图例写了['train', 'test'],但训练时完全没加验证集(validation_data参数缺失),history里根本没有测试集的acc数据;而且单个数据点默认无连线,视觉上极易被忽略。
针对性解决方案:
方案一:收集所有训练的acc数据
不要每次覆盖history,用列表累计每一轮的acc值:
# 初始化列表保存所有epoch的acc acc_history = [] epoch_size = 50 batch_size = 你的批次大小 for i in range(epoch_size): history = model.fit(trainingX[:10], trainingY[:10], epochs=1, batch_size=batch_size, callbacks=[early_stop], verbose=2) # 取出本次训练的acc并加入列表 acc_history.append(history.history['acc'][0]) # 绘图 plt.plot(acc_history, marker='o') # 加上marker让单点更明显 plt.title('model accuracy') plt.ylabel('acc') plt.xlabel('epoch') plt.legend(['train'], loc='upper left') # 去掉不存在的test图例 plt.show()
方案二:检查并调整Early Stopping
先暂时注释掉callbacks=[early_stop],跑一轮训练看看history.history['acc']是否有正常数据。如果是early stop导致训练提前终止,你可以:
- 调整
early_stop的监测指标(比如从val_loss改成loss,或者增大patience值) - 或者在小数据集测试阶段直接禁用early stop
方案三:验证训练数据的合理性
你只用了10条样本训练,模型可能几轮就完全过拟合,acc直接跳到1.0并保持不变。可以先打印acc_history看看数值,如果所有值都是1.0,那绘图是一条平线,调整y轴范围就能看到了。
内容的提问来源于stack exchange,提问作者jejjejd
相关产品推荐
相关产品推荐

