使用最新版Keras加载旧版v2.3.1保存的.h5模型报错
旧版Keras(v2.3.1)模型在新版Keras中加载报错的解决办法
问题说明
使用Keras v2.3.1创建并保存为.h5格式的模型,在新版Keras中调用load_model()加载时出现如下错误:
ValueError: Kernel shape must have the same length as input, but received kernel of shape (4, 4, 1, 128) and input of shape (None, None, 6, 7, 1).
该模型在旧版Keras环境中可正常加载,仅新版环境下触发维度不匹配异常。
问题原因
Keras版本迭代后,卷积层对输入维度的处理逻辑发生了变化。旧版Keras(v2.3.1属于早期v2.x版本)中卷积核的维度定义逻辑与新版不兼容,导致加载时模型结构解析出现错位,原本适配4D输入的卷积核被错误解析为对应5D输入的结构,进而引发形状不匹配报错。
可行解决方案
1. 兼容模式加载后调整并重新编译
加载模型时跳过编译步骤,避免即时的维度检查,之后手动修正输入维度并重新编译:
from keras.models import load_model # 不编译加载模型 model = load_model('model.h5', compile=False) # 根据旧版模型的实际输入维度调整,示例为(None, None, 1) model.input.set_shape((None, None, 1)) # 按需求重新编译模型 model.compile(optimizer='adam', loss='你的损失函数')
2. 借助旧版环境转存为SavedModel格式
若仍能访问旧版Keras环境,先加载模型并导出为新版支持的SavedModel格式,再在新版环境中加载:
# 旧版Keras环境执行 from keras.models import load_model model = load_model('model.h5') # 导出为TensorFlow SavedModel格式 model.save('saved_model_dir', save_format='tf') # 新版Keras环境执行 from tensorflow.keras.models import load_model model = load_model('saved_model_dir')
3. 手动重构模型并加载权重
如果前两种方法无效,可以在新版Keras中完全复刻旧版模型的结构,再通过权重文件加载参数:
from keras.models import Sequential from keras.layers import Conv2D, Dense, ... # 导入旧版模型用到的层 # 1:1复刻旧版模型的层结构与参数 model = Sequential() model.add(Conv2D(128, (4,4), input_shape=(None, None, 1), ...)) # 参数要和旧版完全一致 # 添加其他层... # 加载权重,跳过不匹配检查并按层名匹配 model.load_weights('model.h5', by_name=True, skip_mismatch=True)
内容的提问来源于stack exchange,提问作者codebox
相关产品推荐
相关产品推荐

