能否用Keras的load_model在后端访问model.h5?Heroku部署加载失败求助
解决Heroku部署Flask应用加载.h5模型失败的问题
以下是几种常见的排查和解决方法:
1. 修正模型文件路径
本地测试时直接用model.h5能找到文件,但Heroku部署后应用的工作目录可能和本地不一致,导致路径错误。你需要通过代码获取绝对路径:
- 如果在Flask上下文中(比如路由函数内),可以用
current_app.root_path拼接路径:
import os from flask import current_app from tensorflow.keras.models import load_model model_path = os.path.join(current_app.root_path, 'model.h5') model = load_model(model_path)
- 如果不在Flask上下文里,用当前脚本的目录来拼接:
import os from tensorflow.keras.models import load_model # 获取当前脚本所在目录的绝对路径 base_dir = os.path.dirname(os.path.abspath(__file__)) model_path = os.path.join(base_dir, 'model.h5') model = load_model(model_path)
2. 检查Heroku Slug大小限制
Heroku默认限制应用slug(包含代码、依赖、静态文件等的压缩包)大小为500MB,如果你的model.h5文件过大,可能导致部署时文件未被完整上传。
- 查看Heroku日志,确认是否有slug过大的警告信息。
- 如果模型超过限制,建议将模型存储到外部云存储,部署时从存储服务下载到Heroku的临时目录
/tmp再加载:
import boto3 import os from tensorflow.keras.models import load_model # 初始化S3客户端(需配置环境变量存储密钥) s3 = boto3.client('s3') temp_model_path = '/tmp/model.h5' # 从S3下载模型到临时目录 s3.download_file('你的存储桶名称', 'model.h5', temp_model_path) model = load_model(temp_model_path)
3. 对齐依赖版本
本地和Heroku上的TensorFlow/Keras版本不一致,可能导致模型加载失败。确保requirements.txt中指定的版本与本地测试环境完全一致,例如:
tensorflow==2.15.0 flask==2.3.3 # 其他依赖...
4. 确认模型文件完整性
GitHub上传二进制文件时可能出现损坏,尤其是大文件:
- 检查GitHub仓库中
model.h5的文件大小是否与本地一致,若不一致,重新上传。 - 如果模型文件超过100MB,需要使用Git LFS管理大文件,并在Heroku添加
heroku-buildpack-git-lfs构建包,确保部署时能正确拉取模型文件。
内容的提问来源于stack exchange,提问作者Sai Gruheeth
相关产品推荐
相关产品推荐

