如何在Keras Tuner调参后完整保存含超参数与权重的模型?
解决Keras Tuner Hyperband调优后模型存储优化问题
问题根源
直接使用save_model或保存为h5文件无效,核心原因是HyperModel基于动态超参数生成模型结构,普通保存方式无法完整记录模型的结构生成逻辑,或者加载时未先基于最优超参数重建模型结构,导致结构不匹配报错。
优化存储空间的解决方案
第一步:清理调优阶段冗余文件
Hyperband生成的30个试验文件夹,调优完成后仅需保留最优试验的checkpoint,其余可直接删除——这能立刻减少大部分初始存储占用。
第二步:最优超参数持久化(仅存一份)
把最优超参数保存为JSON文件,代替重复保存完整模型结构,后续所有实体的模型都基于这份超参数重建:
# 保存最优超参数 best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] import json with open("best_hps_config.json", "w") as f: json.dump(best_hps.values, f) # 后续加载超参数重建模型 with open("best_hps_config.json", "r") as f: hps_config = json.load(f) best_hps = keras_tuner.HyperParameters.from_config(hps_config) my_model = tuner.hypermodel.build(best_hps)
第三步:每个实体仅保存权重文件(核心省空间操作)
每个实体训练完成后,只保存模型权重而非完整模型,权重文件体积远小于完整模型:
# 实体训练完成后保存权重 my_model.save_weights(f"entity_{entity_id}_weights.h5") # 加载时先重建模型,再加载权重 my_model.load_weights(f"entity_{entity_id}_weights.h5").expect_partial()
可选:若需保存完整模型(适合部署场景)
如果必须保存完整模型,需确保模型结构可序列化(无不可序列化的自定义层,若有则实现get_config和from_config方法),使用SavedModel格式而非h5:
# 保存完整模型 my_model.save(f"entity_{entity_id}_saved_model") # 直接加载模型 my_model = keras.models.load_model(f"entity_{entity_id}_saved_model")
之前操作无效的原因排查
- h5格式对动态生成的模型结构支持有限,无法完整序列化HyperModel的动态参数依赖,导致加载时结构不匹配。
- 若直接调用
load_model而未先基于超参数重建模型结构,SavedModel无法逆向生成动态构建的模型结构,引发报错。
内容的提问来源于stack exchange,提问作者Khushi Mehta
相关产品推荐
相关产品推荐

