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(最近一次调用最后一次)
/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(),但我无法预料出了什么问题。 请帮助我克服这个错误 谢谢阅读!祝你有美好的一天!
问题是 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。
希望这有帮助。