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
相关产品推荐
相关产品推荐

