Keras加载model.h5本地运行正常,部署到Heroku时报错如何解决?
问题解决方案
步骤1:确认model.h5确实部署到了Heroku实例
- 先检查你的GitHub仓库里是否有model.h5文件:如果文件大小超过100M,GitHub默认不允许直接上传,需要用Git LFS存储,否则你提交的只是个指针文件,实际模型数据没传上去,Heroku拉取的时候拿到的是无效文件,自然会被识别为非h5格式,触发SavedModel查找逻辑
- 排查.slugignore缓存:删除.slugignore后需要清空Heroku的构建缓存再重新部署,执行命令
heroku builds:cache:purge -a 你的Heroku应用名,之后重新push代码部署,避免之前的忽略规则缓存生效 - 部署后可以临时加一行代码打印目录文件确认:在加载模型前加
print(os.listdir(os.path.dirname(os.path.abspath(__file__)))),之后到Heroku应用的日志面板查看输出,确认model.h5在文件列表中
步骤2:修正路径加载逻辑
不要直接用相对路径加载,用当前脚本的绝对路径拼接模型文件名,避免工作目录偏移导致找不到文件,修改加载代码为:
import streamlit as st import numpy as np import cv2 from tensorflow.keras.models import load_model import os # 获取当前脚本所在目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) model_path = os.path.join(current_dir, "model.h5") model = load_model(model_path, compile=False)
注意这里把from keras.models import load_model改成了from tensorflow.keras.models import load_model,避免独立keras库和TensorFlow内置keras的版本冲突,现在主流的TensorFlow版本都内置keras,不需要单独安装独立keras包。
步骤3:对齐TensorFlow版本
在你的项目的requirements.txt里明确指定TensorFlow版本,和你本地保存模型时用的版本完全一致,比如你本地用的是tensorflow==2.10.0,就写tensorflow==2.10.0,不要写tensorflow>=xxx或者不写版本,避免Heroku自动安装最新版本导致版本不兼容,高版本TensorFlow对旧版h5格式模型的加载逻辑有变动,会优先识别为SavedModel格式,出现你遇到的报错。
可选方案:如果h5加载始终有问题,可切换为SavedModel格式
如果上面的步骤都试了还是不行,可以把模型转成SavedModel格式,保存的时候用model.save("my_model")(不要加.h5后缀),就会自动生成一个my_model的文件夹,里面包含pb格式文件和变量目录,加载的时候直接传文件夹路径load_model("my_model")即可,这种格式是TensorFlow官方推荐的存储格式,兼容性更好,不会出现h5的版本适配问题。
内容的提问来源于stack exchange,提问作者J minding
相关产品推荐
相关产品推荐

