加载Keras模型失败求助:无法加载fer2013仓库的模型文件
解决加载fer2013 Keras模型失败的问题
问题分析
你遇到的两个错误对应不同核心问题:
- JSONDecodeError:要么是
fer.json文件损坏、下载不完整,要么是旧版Keras保存的模型结构与当前tf.keras版本不兼容。 - 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→paddingdim_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
相关产品推荐
相关产品推荐

