导入KerasClassifier时出现ModuleNotFoundError问题求助
解决KerasClassifier导入失败的问题
问题根源
Keras 3.x及以上版本已移除keras.wrappers和tensorflow.keras.wrappers模块,这是导致导入报错的核心原因。以下是几种可行的解决方法:
- 先确认当前Keras版本
运行代码查看版本,确认是否为3.x及以上:import keras print(keras.__version__)
- 方案1:使用官方替代工具
keras.utils.wrap_model
这是Keras官方推荐的替代方案,用于将Keras模型适配为scikit-learn兼容接口:from keras.utils import wrap_model from sklearn.model_selection import cross_val_score from keras.models import Sequential from keras.layers import Dense # 定义你的Keras模型 def create_model(): model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model # 包装模型以适配scikit-learn接口 model = create_model() wrapped_model = wrap_model(model, input_shape=(8,)) # 后续可直接使用scikit-learn的方法(例如交叉验证) # scores = cross_val_score(wrapped_model, X, y, cv=5)
- 方案2:自定义适配scikit-learn的分类器类
若需要更灵活的控制逻辑,可手动实现scikit-learn的接口规范:from sklearn.base import BaseEstimator, ClassifierMixin from keras.models import Sequential from keras.layers import Dense import numpy as np class KerasClassifier(BaseEstimator, ClassifierMixin): def __init__(self, build_fn, epochs=10, batch_size=32): self.build_fn = build_fn self.epochs = epochs self.batch_size = batch_size self.model = None def fit(self, X, y): self.model = self.build_fn() self.model.fit(X, y, epochs=self.epochs, batch_size=self.batch_size, verbose=0) return self def predict(self, X): predictions = self.model.predict(X, verbose=0) # 适配二分类和多分类场景 return np.argmax(predictions, axis=1) if predictions.shape[1]>1 else (predictions > 0.5).astype(int).flatten() def score(self, X, y): _, accuracy = self.model.evaluate(X, y, verbose=0) return accuracy # 使用示例 def create_model(): model = Sequential() model.add(Dense(12, input_shape=(8,), activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model clf = KerasClassifier(build_fn=create_model, epochs=20, batch_size=16) # clf.fit(X_train, y_train) # print(clf.score(X_test, y_test))
- 方案3:降级到旧版Keras
如果必须保留原导入逻辑,可以降级到Keras 2.x版本(需匹配对应TensorFlow版本):pip install keras==2.15.0 tensorflow==2.15.0
内容的提问来源于stack exchange,提问作者Jay_G
相关产品推荐
相关产品推荐

