You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:46:40