KerasRegressor参数错误:activation参数无效问题求助
问题:SciKeras KerasRegressor结合GridSearchCV调优LSTM回归模型时参数报错
错误信息
ValueError: Invalid parameter activation for estimator KerasRegressor. This issue can likely be resolved by setting this parameter in the KerasRegressor constructor: `KerasRegressor(activation=relu)` Check the list of available parameters with `estimator.get_params().keys()`
用户代码
#network from matplotlib import pyplot from keras.models import Sequential from keras.layers import LSTM, Dense,Dropout from keras.metrics import mae from keras .optimizers import Adam from sklearn.model_selection import GridSearchCV from scikeras.wrappers import KerasRegressor # Define the LSTM network architecture def create_lstm_model(neurons, optimizer, activation): model = Sequential() model.add(LSTM(units=neurons, input_shape=(train_X.shape[1],train_X.shape[2]))) model.add(Dense(1, activation=activation)) model.compile(loss='mae', optimizer=optimizer) return model # define the grid search parameters param_grid = {'neurons': [8, 16, 32, 64, 128], 'optimizer': ['SGD', 'RMSprop', 'Adam'], 'activation':['relu', 'tanh', 'sigmoid', 'linear','swish']} model = KerasRegressor(build_fn=create_lstm_model, epochs=10, batch_size=16, verbose=0) # Apply grid search grid = GridSearchCV(estimator=model, param_grid=param_grid,cv=3,refit=False, scoring="neg_mean_absolute_error", n_jobs = -1) grid_result = grid.fit(train_X, train_y, validation_data=(test_X, test_y))
解决方案
错误根源是SciKeras的KerasRegressor对参数传递有明确规则:传递给模型构建函数(即create_lstm_model)的参数,必须在param_grid中以model__为前缀,否则会被识别为KerasRegressor自身的参数,而KerasRegressor本身并没有activation、neurons这类参数,因此触发报错。
修正步骤:
- 修改
param_grid中的参数名,给每个模型构建函数的参数加上model__前缀 - 保持模型构建函数的定义不变,确保参数名与前缀后的名称对应
修正后的代码如下:
#network from matplotlib import pyplot from keras.models import Sequential from keras.layers import LSTM, Dense,Dropout from keras.metrics import mae from keras .optimizers import Adam from sklearn.model_selection import GridSearchCV from scikeras.wrappers import KerasRegressor # Define the LSTM network architecture def create_lstm_model(neurons, optimizer, activation): model = Sequential() model.add(LSTM(units=neurons, input_shape=(train_X.shape[1],train_X.shape[2]))) model.add(Dense(1, activation=activation)) model.compile(loss='mae', optimizer=optimizer) return model # 修正:给模型参数加上model__前缀 param_grid = {'model__neurons': [8, 16, 32, 64, 128], 'model__optimizer': ['SGD', 'RMSprop', 'Adam'], 'model__activation':['relu', 'tanh', 'sigmoid', 'linear','swish']} model = KerasRegressor(build_fn=create_lstm_model, epochs=10, batch_size=16, verbose=0) # Apply grid search grid = GridSearchCV(estimator=model, param_grid=param_grid,cv=3,refit=False, scoring="neg_mean_absolute_error", n_jobs = -1) grid_result = grid.fit(train_X, train_y, validation_data=(test_X, test_y))
另外,如果你使用的是较新版本的SciKeras,推荐使用model参数替代build_fn(更符合Scikit-learn风格),示例如下:
# 改用model参数的写法 class LSTMModel(Sequential): def __init__(self, neurons, optimizer, activation): super().__init__() self.add(LSTM(units=neurons, input_shape=(train_X.shape[1],train_X.shape[2]))) self.add(Dense(1, activation=activation)) self.compile(loss='mae', optimizer=optimizer) model = KerasRegressor(model=LSTMModel, epochs=10, batch_size=16, verbose=0) # param_grid同样使用model__前缀,和之前一致
内容的提问来源于stack exchange,提问作者Khaled Saleh
相关产品推荐
相关产品推荐

