Streamlit应用依赖报错,加载pickle存储的Keras模型运行失败求助
报错原因分析
- Keras模型序列化方式错误:pickle会完整记录模型类的导入路径、内部依赖对象的结构,而Keras/TensorFlow的模型层、计算图对象本身不兼容pickle序列化规范,无法保证跨环境/跨版本加载的可用性,是这类报错的核心诱因。
- 依赖版本不匹配:训练模型时使用的Keras、TensorFlow版本和当前运行环境的版本不一致,导致pickle加载时无法找到对应路径的类定义,你遇到的
No module named 'keras.engine.sequential'报错就是典型的版本差异导致的类路径变更问题。 - 运行环境依赖冲突:当前Anaconda环境未正确安装对应版本的Keras/TensorFlow,或者同时安装了独立Keras包和TensorFlow内置的tf.keras,导致导入路径冲突。
解决方案
- 改用Keras官方序列化方案(优先推荐)
完全替换pickle的存储逻辑,使用Keras原生的模型保存加载接口,规避序列化兼容问题:
- 训练阶段保存模型:
# Keras 3.x 推荐使用原生.keras格式 model.save('model_pose.keras') # 旧版本Keras/TensorFlow可使用.h5格式 # model.save('model_pose.h5')
- 应用阶段加载模型:
model = keras.models.load_model(os.path.join(ruta_to_model, 'model_pose.keras'))
- 对齐运行环境版本
如果确实需要保留pickle序列化的模型,需要保证运行环境和训练环境的依赖完全一致:
- 在训练模型的环境中执行
pip freeze > requirements.txt导出依赖清单 - 在当前运行Streamlit的Anaconda环境中执行
pip install -r requirements.txt安装完全匹配的依赖版本,避免类路径变更问题。
- 修复依赖冲突
如果同时安装了独立Keras包和TensorFlow,建议统一使用TensorFlow内置的Keras接口,代码中所有导入keras的语句统一替换为from tensorflow import keras,保证导入路径一致。
内容的提问来源于stack exchange,提问作者Lash
相关产品推荐
相关产品推荐

