导入KerasRegressor遇ModuleNotFoundError及Scikeras适配问题求助
问题1:ModuleNotFoundError: No module named 'tensorflow.keras.wrappers'
原因
TensorFlow 2.10及以上版本已移除tensorflow.keras.wrappers.scikit_learn模块,官方明确推荐使用第三方库scikeras作为替代方案。
解决步骤
- 安装scikeras(适配TensorFlow版本):
pip install scikeras[tensorflow]
若使用原生Keras而非TensorFlow Keras,安装命令为:
pip install scikeras[keras]
问题2:ValueError: Invalid parameter lr for estimator KerasRegressor
核心原因
- 参数传递规则差异:scikeras中,模型内部的自定义参数(如学习率、网络结构参数)需要添加
model__前缀,直接写参数名会被识别为KerasRegressor自身的参数,而非传递给你的ann_model的参数。 - 代码语法错误:你的
param_grid定义末尾缺少闭合的},导致语法解析失败。 - 模型形式错误:
ann_model必须是可接收参数的函数(而非已实例化的模型),否则无法动态调整网格搜索中的参数。
解决步骤
1. 修正模型定义
将ann_model改为可接收参数的函数,示例如下:
import keras def ann_model(number_of_hidden_layers=1, number_of_neurons=16, lr=0.001): model = keras.models.Sequential() # 输入层 model.add(keras.layers.Dense(number_of_neurons, activation='relu', input_shape=(x_train.shape[1],))) # 动态添加隐藏层 for _ in range(number_of_hidden_layers - 1): model.add(keras.layers.Dense(number_of_neurons, activation='relu')) # 回归任务输出层(线性激活) model.add(keras.layers.Dense(1)) # 使用传入的学习率编译模型 optimizer = keras.optimizers.Adam(learning_rate=lr) model.compile(optimizer=optimizer, loss='mse') return model
2. 修正网格搜索代码
添加参数前缀并修复语法错误:
from scikeras.wrappers import KerasRegressor from sklearn.model_selection import GridSearchCV # 传入模型函数(而非实例化模型) keras_sk_reg = KerasRegressor(model=ann_model) # 参数添加model__前缀,修复语法闭合问题 param_grid = { 'model__number_of_hidden_layers': [1, 3, 5], 'model__number_of_neurons': [16, 32, 64], 'model__lr': [0.001, 0.01, 0.1] } keras_sk_reg_gs = GridSearchCV(keras_sk_reg, param_grid=param_grid) # GridSearchCV会自动划分交叉验证集,无需传入validation_data keras_sk_reg_gs.fit(x_train, y_train, epochs=10, callbacks=[keras.callbacks.EarlyStopping(patience=5)])
额外注意
GridSearchCV在交叉验证过程中会自动将训练集拆分为训练/验证子集,因此fit方法中不需要传入validation_data,否则会引发参数冲突。
内容的提问来源于stack exchange,提问作者Mohammad Mehdi Ghirati
相关产品推荐
相关产品推荐

