导入KerasClassifier遇ModuleNotFoundError的解决问询
解决
ModuleNotFoundError: No module named 'tensorflow.keras.wrappers'问题 在VSCode中导入KerasClassifier时出现以下错误:
ModuleNotFoundError Traceback (most recent call last) Cell In[7], line 1 1 from tensorflow.keras.wrappers.scikit_learn import KerasClassifier ModuleNotFoundError: No module named 'tensorflow.keras.wrappers'
解决方案
方案1:使用独立Keras的Scikit-learn封装
TensorFlow 2.10及以上版本移除了tensorflow.keras.wrappers模块,可改用独立Keras库中的封装:
- 安装依赖:
pip install keras scikit-learn
- 修改导入语句:
# 替换原导入 from keras.wrappers.scikit_learn import KerasClassifier
后续代码无需其他修改,原有的KerasClassifier调用逻辑保持不变。
方案2:自定义Scikit-learn兼容封装器
若不想安装额外库,可手动实现适配Scikit-learn接口的封装类,替代KerasClassifier:
from sklearn.base import BaseEstimator, ClassifierMixin class CustomKerasClassifier(BaseEstimator, ClassifierMixin): def __init__(self, lstm_units=50, learning_rate=0.01, epochs=10, batch_size=32, verbose=1): self.lstm_units = lstm_units self.learning_rate = learning_rate self.epochs = epochs self.batch_size = batch_size self.verbose = verbose self.model = None def create_model(self): model = Sequential() model.add(LSTM(self.lstm_units, activation='relu', input_shape=(5, 9))) model.add(Dense(580, activation='softmax')) optimizer = Adam(learning_rate=self.learning_rate) model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model def fit(self, X, y, **kwargs): self.model = self.create_model() self.model.fit(X, y, epochs=self.epochs, batch_size=self.batch_size, verbose=self.verbose, **kwargs) return self def predict(self, X): return self.model.predict(X, batch_size=self.batch_size, verbose=self.verbose) def score(self, X, y, **kwargs): loss, accuracy = self.model.evaluate(X, y, batch_size=self.batch_size, verbose=self.verbose, **kwargs) return accuracy
然后修改代码中的模型初始化部分:
# 替换原KerasClassifier初始化 model = CustomKerasClassifier(epochs=10, batch_size=32, verbose=1) param_grid = {'lstm_units': [30, 50, 70], 'learning_rate': [0.001, 0.01, 0.1]} grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3) grid_result = grid.fit(X, y)
验证修改
运行修改后的代码,即可正常使用GridSearchCV进行超参数调优,逻辑与原代码一致。
内容的提问来源于stack exchange,提问作者Tony H
相关产品推荐
相关产品推荐

