Keras.models.load_model加载H5音频检测模型失败求助
解决Keras加载H5模型时的TypeError: tuple indices must be integers or slices, not list问题
这个问题我之前也碰到过,本质是旧版本Keras在序列化BatchNormalization层的axis参数时出现的bug——你代码里定义的axis=-1(整数)在保存模型时被错误序列化成了列表(比如[-1]),加载模型时解析这个参数就会触发类型错误。下面给你几个可行的解决方法:
方法一:自定义BatchNormalization修复加载逻辑
直接在加载模型时,通过自定义对象修复axis参数的解析问题,不需要重新训练模型:
from keras.layers import BatchNormalization from keras.models import load_model class FixedBatchNormalization(BatchNormalization): @classmethod def from_config(cls, config): # 检查axis是否被序列化为列表,若是则提取第一个元素转为整数 if isinstance(config.get('axis'), list): config['axis'] = config['axis'][0] return super().from_config(config) # 加载模型时传入自定义的BatchNormalization类 # 注意路径用原始字符串避免转义问题 model = load_model(r'.\Data\Keras_Model\(19.07.30).h5', custom_objects={'BatchNormalization': FixedBatchNormalization})
方法二:拆分模型结构与权重保存(推荐)
避开完整模型保存的序列化问题,分别保存模型结构和权重,加载时再组合:
重新保存模型(训练时修改保存逻辑)
# 保存模型结构为JSON文件 model_json = model.to_json() with open(r'.\Data\Keras_Model\model_structure.json', 'w') as json_file: json_file.write(model_json) # 保存模型权重 model.save_weights(r'.\Data\Keras_Model\model_weights.h5')
加载模型
from keras.models import model_from_json from keras.optimizers import Adam # 加载模型结构 with open(r'.\Data\Keras_Model\model_structure.json', 'r') as json_file: loaded_model_json = json_file.read() loaded_model = model_from_json(loaded_model_json) # 加载权重 loaded_model.load_weights(r'.\Data\Keras_Model\model_weights.h5') # 重新编译模型(如果需要评估或继续训练) adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.0) loaded_model.compile(loss="binary_crossentropy", optimizer=adam, metrics=["accuracy"])
方法三:升级Keras到稳定版本
如果你的Keras版本比较旧(比如2.1.0之前),升级到最新的稳定版可以从根源上避免这个序列化bug:
pip install --upgrade keras
额外注意点
- 路径中的反斜杠尽量用原始字符串前缀
r''或者双反斜杠\\,避免转义字符引发的隐性问题; - 加载模型后如果要继续训练或评估,记得确认模型已经正确编译(方法二需要手动编译,方法一加载的模型会保留编译状态)。
内容的提问来源于stack exchange,提问作者valentineday
相关产品推荐
相关产品推荐

