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

Keras训练Unet绘图时出现val_loss、val_iou_score的KeyError报错

问题排查方案

核心原因

val_loss、val_iou_score这类带val_前缀的指标,只会在model.fit()实际执行了验证步骤时才会写入history.history字典中,报错说明验证流程并未正常运行,没有生成对应的验证指标。

逐项排查步骤

  • 第一步:核对验证步数参数
    打印val_steps_per_epoch的值,确认它大于0。很多时候是计算验证步数时用了验证集样本数 // batch_size,当验证集样本数小于batch_size时,整除结果会变成0,Keras遇到0的validation_steps会直接跳过验证流程。
    修复方案:验证步数改用向上取整计算,示例:
    import math
    val_steps_per_epoch = math.ceil(验证集样本数 / 验证batch_size)
    
  • 第二步:验证验证集生成器可用性
    手动调用next(val_img_gen),检查能否正常输出(图像数组、标签数组)的元组,如果生成器为空、报错或返回无效数据,验证步骤也会被跳过。
  • 第三步:确认训练日志输出
    查看model.fit()运行时的控制台输出,每个epoch结束后是否有val_loss、val_iou_score的打印值,如果没有则说明验证步骤确实未执行。
  • 第四步:核对history的实际键名
    如果确认验证步骤已执行仍报错,打印history.history的所有键确认实际命名,避免指标名拼写偏差:
    print(history.history.keys())
    
    部分版本的自定义指标可能存在命名规则差异,按打印出的实际键名取值即可。

临时兼容方案

如果只需先跑通绘图流程,可添加存在性判断避免报错,没有验证指标时仅绘制训练曲线:

loss = history.history['loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'y', label='Training loss')
# 仅存在验证损失时绘制
if 'val_loss' in history.history:
    val_loss = history.history['val_loss']
    plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

acc = history.history['iou_score'] 
plt.plot(epochs, acc, 'y', label='Training IoU')
# 仅存在验证IoU时绘制
if 'val_iou_score' in history.history:
    val_acc = history.history['val_iou_score']
    plt.plot(epochs, val_acc, 'r', label='Validation IoU')
plt.title('Training and validation IoU')
plt.xlabel('Epochs')
plt.ylabel('IoU')
plt.legend()
plt.show()

内容的提问来源于stack exchange,提问作者Maliesha Kalutota

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:42:00