You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动