You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这类参数,因此触发报错。

修正步骤:

  1. 修改param_grid中的参数名,给每个模型构建函数的参数加上model__前缀
  2. 保持模型构建函数的定义不变,确保参数名与前缀后的名称对应

修正后的代码如下:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:33:28