keras.wrappers模块缺失,求GridSearchCV优化LSTM模型的替代方案
解决
ModuleNotFoundError: No module named 'keras.wrappers'问题 问题原因
keras.wrappers.scikit_learn模块在TensorFlow整合Keras后已被迁移,单独的Keras包也不再维护该模块。目前有两种靠谱的替代方案:
方案1:使用TensorFlow自带的Scikit-learn wrapper
TensorFlow的Keras模块内置了兼容scikit-learn的wrapper,只需调整导入路径即可:
- 修改所有Keras相关的导入语句,统一使用
tensorflow.keras路径 - 补全缺失的
Sequential导入 - 替换
KerasRegressor的导入来源
修改后的完整代码:
from tensorflow.keras.layers import Dense, LSTM, Dropout from tensorflow.keras import optimizers from tensorflow.keras.models import Sequential # 补全导入 from sklearn.model_selection import GridSearchCV from tensorflow.keras.wrappers.scikit_learn import KerasRegressor def create_model(unit, dropout_rate, lr ): model=Sequential() model.add(LSTM(unit,return_sequences=True, input_shape=(1,5))) model.add(Dropout(dropout_rate)) model.add(LSTM(unit)) model.add(Dropout(dropout_rate)) model.add(Dense(1)) adam= optimizers.Adam(learning_rate=lr) # 新版Adam推荐用learning_rate参数,旧版lr也兼容 model.compile(optimizer=adam, loss='mean_squared_error') return model my_regressor = KerasRegressor(build_fn=create_model, verbose=2) grid_param_LSTM = { 'unit': [50, 70, 120], 'batch_size': [12, 24, 48], 'epochs': [200], 'lr': [0.001, 0.01, 0.1], 'dropout_rate':[0.1, 0.2, 0.3] } grid_GBR = GridSearchCV(estimator=my_regressor, param_grid = grid_param_LSTM, scoring = 'neg_root_mean_squared_error', cv = 2) grid_GBR.fit(X_train, y_train) print("Best: %f using %s" % (grid_GBR.best_score_, grid_GBR.best_params_))
方案2:使用Scikeras(推荐)
Scikeras是专门为scikit-learn和Keras/TensorFlow打造的兼容库,维护更活跃,功能更完善,官方也更推荐使用它替代旧的Keras wrapper:
- 先在Colab中安装Scikeras:
!pip install scikeras
- 修改导入语句,调整
KerasRegressor的参数(新版用model替代build_fn)
修改后的完整代码:
from tensorflow.keras.layers import Dense, LSTM, Dropout from tensorflow.keras import optimizers from tensorflow.keras.models import Sequential from sklearn.model_selection import GridSearchCV from scikeras.wrappers import KerasRegressor def create_model(unit, dropout_rate, lr ): model=Sequential() model.add(LSTM(unit,return_sequences=True, input_shape=(1,5))) model.add(Dropout(dropout_rate)) model.add(LSTM(unit)) model.add(Dropout(dropout_rate)) model.add(Dense(1)) adam= optimizers.Adam(learning_rate=lr) model.compile(optimizer=adam, loss='mean_squared_error') return model # 注意:Scikeras推荐用model参数替代build_fn my_regressor = KerasRegressor(model=create_model, verbose=2) grid_param_LSTM = { 'unit': [50, 70, 120], 'batch_size': [12, 24, 48], 'epochs': [200], 'lr': [0.001, 0.01, 0.1], 'dropout_rate':[0.1, 0.2, 0.3] } grid_GBR = GridSearchCV(estimator=my_regressor, param_grid = grid_param_LSTM, scoring = 'neg_root_mean_squared_error', cv = 2) grid_GBR.fit(X_train, y_train) print("Best: %f using %s" % (grid_GBR.best_score_, grid_GBR.best_params_))
额外提示
- 新版TensorFlow的
Adam优化器推荐使用learning_rate参数替代旧的lr,不过旧参数也能兼容 - 确保你的Colab环境中TensorFlow版本是2.x,目前Colab默认就是2.x版本
内容的提问来源于stack exchange,提问作者Bouram
相关产品推荐
相关产品推荐

