Windows正常运行的Keras模型在Linux下load_model触发段错误求助
解决Windows导出的Keras模型在Linux下
load_model段错误的问题 看起来你遇到的是典型的跨平台Keras模型加载兼容性问题,段错误(Segmentation Fault)通常意味着内存访问异常,大概率是模型序列化/反序列化过程中因为环境差异导致的解析错误。结合你给出的环境信息,我整理了几个针对性的解决方案,按优先级尝试:
1. 对齐TensorFlow和h5py的版本
你的Windows环境用的是TensorFlow 1.4.0,而Linux是1.4.1——虽然是小版本差异,但TensorFlow底层的模型序列化机制可能存在细微差别,这很可能是问题根源。另外,读写HDF5模型的h5py库版本也需要完全一致:
- 在Linux上卸载当前TensorFlow,安装和Windows完全相同的版本:
pip uninstall tensorflow -y && pip install tensorflow==1.4.0 - 先在Windows上执行
pip show h5py查看版本号,然后在Linux上安装对应版本:pip uninstall h5py -y && pip install h5py==<你的Windows版本号>
2. 验证模型文件完整性
跨平台传输文件时很容易出现损坏,导致加载时解析失败触发段错误。先校验文件哈希:
- Windows(PowerShell):
Get-FileHash model.h5 -Algorithm MD5 - Linux:
md5sum model.h5
对比两个哈希值,如果不一致,重新传输模型文件(建议用压缩包传输避免损坏)。
3. 分离加载模型结构和权重
如果直接用load_model失败,试试拆分加载流程,绕过可能的配置序列化问题:
第一步:在Windows上导出模型结构和权重
from keras.models import load_model, model_from_json # 加载本地模型 model = load_model("model.h5") # 导出结构为JSON model_json = model.to_json() with open("model.json", "w") as f: f.write(model_json) # 导出权重 model.save_weights("model_weights.h5")
第二步:在Linux上加载
from keras.models import model_from_json # 加载模型结构 with open("model.json", "r") as f: model_json = f.read() loaded_model = model_from_json(model_json) # 加载权重 loaded_model.load_weights("model_weights.h5")
4. 检查自定义层/损失函数(如果有)
如果你的模型包含自定义层、自定义损失函数或者自定义度量,必须确保Linux环境中存在完全相同的代码定义——类名、方法名、参数都要一致,否则Keras加载时无法识别对应操作,会触发内存访问错误。
5. 尝试TensorFlow原生SavedModel格式
Keras的.h5格式依赖自身序列化逻辑,而TensorFlow的SavedModel格式兼容性更好,试试转换格式后再加载:
Windows上导出为SavedModel
import tensorflow as tf from keras.models import load_model model = load_model("model.h5") tf.saved_model.simple_save( tf.keras.backend.get_session(), "./saved_model_dir", inputs={"input": model.input}, outputs={output.name: output for output in model.outputs} )
Linux上加载
import tensorflow as tf with tf.Session() as sess: model = tf.saved_model.loader.load(sess, ["serve"], "./saved_model_dir")
先从版本对齐和文件校验开始尝试,这两个是最常见的跨平台加载问题根源,如果还不行再往下试分离加载和格式转换。
内容的提问来源于stack exchange,提问作者user5193284




