如何从GridSearchCV调优出的最优Keras ANN中提取模型权重?
从GridSearchCV结果中提取最优ANN权重的方法
完全可以从现有调参流程的运行结果中直接提取最优模型的权重,不需要重跑超参数搜索流程,操作逻辑如下:
核心逻辑说明
你代码中已经定义了best_model = grid_search.best_estimator_,sklearn的GridSearchCV默认会在完成所有参数组合的交叉验证、定位到最优超参数组合后,自动使用全量训练集X_train、y_train重新训练对应参数的模型,这个实例已经携带了完整的训练后权重,不需要从交叉验证的单折模型中拼凑结果。
具体操作步骤
- 从KerasRegressor封装实例中取出底层原生Keras模型对象
你使用的keras.wrappers.scikit_learn.KerasRegressor会把实际训练完成的Keras Sequential模型存在自身的.model属性下,直接访问即可拿到原生模型:best_keras_model = best_model.model - 按需提取权重
- 提取所有层的权重数组(返回值为numpy格式的列表,顺序和模型层定义顺序一致,包含每层的权重矩阵、偏置项):
all_weights = best_keras_model.get_weights() - 单独查看每一层的权重细节:
for layer_index, layer in enumerate(best_keras_model.layers): # 打印每层的权重、偏置项形状 print(f"第{layer_index}层权重形状:{[w.shape for w in layer.get_weights()]}") - 完整保存模型(包含网络结构、权重、编译配置)到本地,后续可直接加载使用:
best_keras_model.save("optimal_ann.h5")
- 提取所有层的权重数组(返回值为numpy格式的列表,顺序和模型层定义顺序一致,包含每层的权重矩阵、偏置项):
常见注意点
- 如果你初始化GridSearchCV时手动设置了
refit=False,best_estimator_不会自动触发全量训练,自然不存在可提取的权重;你当前的代码使用默认参数,不受这个问题影响。 - 不需要从
cv_results_字典中查找单折训练的权重,该字段仅保存交叉验证过程的指标分数,不会存储具体模型的权重值。
内容的提问来源于stack exchange,提问作者Hoang Mai Trinh
相关产品推荐
相关产品推荐

