You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载Keras模型失败求助:无法加载fer2013仓库的模型文件

解决加载fer2013 Keras模型失败的问题

问题分析

你遇到的两个错误对应不同核心问题:

  1. JSONDecodeError:要么是fer.json文件损坏、下载不完整,要么是旧版Keras保存的模型结构与当前tf.keras版本不兼容。
  2. OSError(文件签名找不到):fer.h5是单独的权重文件,并非用model.save()保存的完整模型文件——load_model()仅支持加载包含模型结构+权重的完整HDF5文件,因此直接加载权重文件必然报错。

解决步骤

1. 先确认文件完整性

首先排查文件是否损坏:

  • 验证JSON文件合法性:
    import json
    try:
        with open('fer.json', 'r') as f:
            json.load(f)
        print("JSON文件格式合法")
    except json.JSONDecodeError as e:
        print(f"JSON文件损坏:{e}")
    
  • 验证H5权重文件合法性:
    import h5py
    try:
        with h5py.File('fer.h5', 'r') as f:
            print(f"权重文件包含的键:{list(f.keys())}")
        print("H5文件格式合法")
    except Exception as e:
        print(f"H5文件损坏:{e}")
    

如果文件损坏,重新下载模型文件——建议通过Git克隆整个fer2013仓库,避免单个文件下载时的截断或编码问题:

git clone https://github.com/priya-dwivedi/face_and_emotion_detection.git  # 替换为实际仓库地址

2. 修正模型加载方式

针对load_model()的错误

放弃用load_model()加载fer.h5,它只是权重文件,必须配合JSON结构文件加载,回到方法1的流程。

针对model_from_json()的JSONDecodeError

方案一:使用旧版Keras加载

如果模型是用旧版纯Keras(而非tf.keras)保存的,安装对应版本的Keras后加载:

pip install keras==2.2.4  # 匹配模型保存时的Keras版本

运行加载代码:

from keras.models import model_from_json

json_file = open('fer.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("fer.h5")
print("Loaded model from disk")
方案二:在tf.keras中兼容旧版模型结构

如果要在当前tf.keras环境中加载,手动修正JSON中的旧版参数并映射层:

  • 打开fer.json,替换旧参数为tf.keras兼容名称:
    • border_mode → padding
    • dim_ordering → data_format(值th改为channels_first,tf改为channels_last)
  • 加载时指定custom_objects映射旧层:
    from tensorflow.keras.models import model_from_json
    from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout
    
    custom_objects = {
        'Conv2D': Conv2D,
        'MaxPooling2D': MaxPooling2D,
        'Dense': Dense,
        'Flatten': Flatten,
        'Dropout': Dropout
        # 根据模型结构添加需要映射的层
    }
    
    json_file = open('fer.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    loaded_model = model_from_json(loaded_model_json, custom_objects=custom_objects)
    loaded_model.load_weights("fer.h5")
    print("Loaded model from disk")
    

3. 终极方案:重新训练模型

如果以上方法都无法解决,直接用fer2013数据集重新训练一个适配当前tf.keras版本的模型,训练完成后用model.save('my_fer_model.h5')保存完整模型,后续即可用load_model()正常加载。


内容的提问来源于stack exchange,提问作者afernandezwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:54:54