使用load_model加载tensorflow.keras训练后模型报JSON解码错误,未训练模型加载正常
问题根因
你遇到的JSONDecodeError: Expecting value: line 1 column 1错误,本质是SavedModel格式下存储模型结构配置的keras_metadata.pb文件损坏导致的。这个文件里序列化了Keras模型的结构元数据,底层用JSON格式存储,所以加载时会调用JSON解析模块,你看不到明文JSON文件是因为这些信息被打包在pb二进制文件里。
你本地构建的空白模型可以正常保存加载,说明本地TensorFlow环境没有问题,问题出在超算平台的模型保存环节,或者SCP跨平台传输环节的文件损坏。
解决方案
- 第一步先确认超算端模型保存完整性
先在超算平台上直接加载训练完成的模型,确认保存环节没有问题。正常TF SavedModel格式的目录应该包含4个部分:saved_model.pb、keras_metadata.pb、variables/文件夹、assets/文件夹,检查超算上的模型目录是否包含所有文件,是否存在训练任务被调度系统提前终止、导致保存流程未执行完成的情况。 - 第二步校验文件传输完整性
跨平台SCP传输大文件很容易出现截断、丢包的问题,可以分别在超算和本地对模型目录做哈希校验:
超算端执行:tar -cf - trained_model_640x64/ | md5sum
本地传输完成后执行同样命令,对比两端的哈希值是否一致,如果不一致说明传输损坏,建议用rsync代替scp传输,支持断点续传和自动校验,命令参考:rsync -avz 超算用户名@超算访问地址:模型目录绝对路径 本地存储路径 - 第三步如果确认超算端模型本身无法加载,调整保存逻辑
保存模型时显式指定格式参数:tf.keras.models.save_model(model, "保存路径", save_format="tf"),避免版本兼容导致的格式识别错误。同时建议额外单独保存权重文件:model.save_weights("保存路径/weights.h5"),就算SavedModel结构损坏,也可以通过本地重建模型结构加载权重复用训练结果。 - 应急方案
如果无法重新传输或重新保存模型,可以直接把超算上模型目录下variables/文件夹的内容拷贝到本地,本地运行你给出的build_model()代码重建相同结构的模型,执行model.load_weights("variables/")即可直接加载训练好的权重,完全跳过SavedModel的解析流程,不会触发JSON解析错误。
内容的提问来源于stack exchange,提问作者Sean Goldie
相关产品推荐
相关产品推荐

