类型错误:create_lstm_model() 缺少 1 个必需的位置参数:“优化器”

问题描述 投票:0回答:1
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()
,但我无法预料会出现什么问题。

python keras deep-learning lstm gridsearchcv
1个回答
0
投票

说明

问题是 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。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.