def create_lstm_model(optimizer, neurons, activation):
model = Sequential()
model.add(LSTM(units=neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(Dense(1, activation=activation))
model.compile(loss='mean_squared_error', optimizer=optimizer)
return model
param_grid = {'neurons': [8, 16, 32, 64, 128],
'optimizer': [SGD(), RMSprop(), Adam()],
'activation': ['relu', 'tanh', 'sigmoid', 'linear','swish']
}
model = KerasRegressor(model=create_lstm_model, neurons=8, activation='relu', epochs=10, batch_size=16, verbose=0)
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, refit=False, scoring="neg_mean_squared_error", n_jobs = -1, error_score='raise')
grid_result = grid.fit(X_train, y_train)
在上面的代码中,我有以下错误:
The above exception was the direct cause of the following exception:
TypeError Traceback (most recent call last)
\<ipython-input-15-f5591384846f\> in \<cell line: 1\>()
130 model = KerasRegressor(model=create_lstm_model, neurons=8, activation='relu', epochs=10, batch_size=16, verbose=0)
131 grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, refit=False, scoring="neg_mean_squared_error", n_jobs = -1, error_score='raise')
\--\> 132 grid_result = grid.fit(X_train, y_train)
133
134 print("-- Evaluating --")
/usr/local/lib/python3.10/dist-packages/joblib/parallel.py in \_return_or_raise(self)
761 try:
762 if self.status == TASK_ERROR:
\--\> 763 raise self.\_result
764 return self.\_result
765 finally:
TypeError: create_lstm_model() missing 1 required positional argument: 'optimizer'
我正在查看该函数
create_lstm_model()
,但我无法预料会出现什么问题。
问题是 create_lstm_model 需要 3 个参数:优化器、神经元和激活。 上面的代码永远不会调用 create_lstm_model 本身。 相反,您可以将函数 create_lstm_model 作为参数传递给函数(或构造函数)KerasRegressor:
model = KerasRegressor(model=create_lstm_model, neurons=8, activation='relu', epochs=10, batch_size=16, verbose=0)
KerasRegressor 内部的代码实际上调用了函数 create_lstm_model。 我在 KerasRegressor 中看不到该代码的作用。 不过大概是这样的:
# could be this
model (*args)
# or maybe this
model (neurons=neurons, activation=activation)
我看到了一些无需修改 KerasRegressor 代码即可修复它的方法。
如果 KerasRegressor 只是将未知参数传递给模型,选项 1 可能只是将优化器作为命名参数传递给 KerasRegressor。 但是,您必须选择一个优化器供其使用,而不是 param_grid 中的 3 个优化器:
opt = param_grid ['optimizer'] [0] # selects SGD ()
model = KerasRegressor(model=create_lstm_model, neurons=8, activation='relu', optimizer=opt, epochs=10, batch_size=16, verbose=0)
选项 2:将 lambda 函数传递给 KerasRegressor。 仅当 KerasRegressor 以固定顺序使用固定参数调用您的函数时才有效(上面的第二个示例)。 同样,您需要首先选择一个优化器。
您的代码变为:
opt = param_grid ['optimizer'] [0] # selects SGD ()
model = KerasRegressor(
model = lambda neurons, activation : create_lstm_model (optim , neurons, activation),
neurons=8, activation='relu', epochs=10, batch_size=16, verbose=0)
选项 3:使用 functools.partial 将优化器参数绑定到 create_lstm_model 并将结果传递给 KerasRegressor。 无论 KerasRegressor 中使用的参数顺序或样式如何,这都应该有效。
选项4:重写create_lstm_model以删除优化器参数。
任何这些都需要重新思考你的方法。 您可能需要循环 3 个不同的优化器,并在每个优化器上分别运行 KerasRegressor / GridSearchCV。
希望这有帮助。