如何克服“TypeError:create_lstm_model()缺少1个必需的位置参数:'optimizer'”

问题描述 投票: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)

在此代码中,我有如下错误。 我是一个初学者,我很难克服这个错误。 这是我第一个使用机器学习的项目,所以如果你帮助我,我将非常高兴!!

上述异常是导致以下异常的直接原因:

TypeError Traceback(最近一次调用最后一次) () 130模型= KerasRegressor(模型= create_lstm_model,神经元= 8,激活='relu',epochs = 10,batch_size = 16,verbose = 0) [第 131 部分] --> 132 grid_result = grid.fit(X_train, y_train) 133 134 print("-- 评估 --")

/usr/local/lib/python3.10/dist-packages/joblib/parallel.py 中的 _return_or_raise(self) 第761章: 第762章 --> 763 提高自我._结果 第764章 第765章 终于:

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

我正在查看函数 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.