训练Keras ShiftViT模型后无法保存提示model/history未定义报错
问题原因
- 首先
history.save()是完全错误的写法:model.fit()返回的History对象仅存储训练过程中的损失、准确率等指标日志,本身不提供save()方法,完全不具备保存模型结构、权重的能力。 - 报
model、history未定义的核心原因是Colab运行时的变量生命周期问题:Colab的代码按单元格独立触发执行,只有已经运行完成的单元格内定义的变量才会被加载到当前运行时环境中。如果你跳序执行,直接先跑包含保存逻辑的单元格,而没有先运行模型定义、模型编译、模型训练的代码,运行时里根本不存在model和history两个对象,自然触发未定义报错。 - 若训练过程中代码抛错中断、或者运行时因为闲置断连被重置,之前定义的变量会被清空,也会出现同样的未定义报错。
修复方案
- 按顺序执行所有前置代码:从依赖导入、数据集加载、ShiftViT模型构建、学习率调度器定义、模型编译,到模型训练、测试评估的所有单元格,必须逐格运行且无报错,确认训练单元格执行完成(左侧显示完成对勾)后,再运行保存逻辑的单元格。
- 修正保存逻辑,删除无效的
history.save()代码,使用正确的API保存模型:
# 挂载谷歌云盘(必须在保存前执行) from google.colab import drive drive.mount('/content/drive') # 保存完整模型(包含网络结构、权重、编译配置) model.save('/content/drive/MyDrive/VIT-SHIFT')
- 如果需要保留训练过程的指标日志,可以单独导出History对象内的字典数据:
import json # 保存训练历史指标 with open('/content/drive/MyDrive/VIT-SHIFT/train_history.json', 'w') as f: json.dump(history.history, f)
- 若后续加载模型时因为自定义学习率调度器、自定义网络层报错,可以改用权重保存方式,兼容性更强:
# 仅保存模型权重 model.save_weights('/content/drive/MyDrive/VIT-SHIFT/model_weights.h5')
- 注意:如果训练过程中Colab因为闲置断连,运行时会被重置,所有变量清空,需要重新从头运行所有前置代码才能执行保存操作,建议长时间训练时在笔记本里设置防断连脚本。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

