使用scikeras KerasClassifier时cross_val_score与fit报TypeError求助
解决Scikeras KerasClassifier的validation_batch_size参数错误问题
问题分析
你遇到的TypeError本质是Scikeras与TensorFlow/Keras版本兼容性,以及Scikeras参数传递机制和旧版Keras封装不同导致的:
- Scikeras默认会向Keras的
fit()方法传递validation_batch_size参数,但旧版TensorFlow的training_v1.fit()不支持该参数。 - 你直接将
epochs、batch_size等fit()参数传给KerasClassifier,不符合Scikeras的命名空间参数规则,加剧了参数传递混乱。
解决方案
1. 修正Scikeras参数传递方式
Scikeras用命名空间前缀区分模型构建、编译、训练阶段的参数,必须为fit()方法的参数添加fit__前缀:
estimator = KerasClassifier( model=base_model, fit__epochs=300, fit__batch_size=200, fit__verbose=0, validation_batch_size=None # 显式禁用自动传递该参数 )
2. 优化模型构建函数(推荐)
将模型编译逻辑从构建函数中剥离,交给Scikeras统一处理,避免参数冲突:
def base_model(): # 仅创建网络结构,不编译 model = Sequential() model.add(Dense(8, input_dim=10, activation='relu')) model.add(Dense(4, activation='softmax')) return model # 初始化时指定编译参数 estimator = KerasClassifier( model=base_model, fit__epochs=300, fit__batch_size=200, fit__verbose=0, compile__loss='categorical_crossentropy', compile__optimizer='adam', compile__metrics=['accuracy'], validation_batch_size=None )
3. 升级库版本确保兼容
执行以下命令升级到兼容版本:
pip install --upgrade scikeras tensorflow
建议使用scikeras>=0.11.0和tensorflow>=2.8.0,避免旧版training_v1的API限制。
4. 验证cross_val_score调用
保持交叉验证代码不变,确保输入数据X和encoded_y为标准numpy数组:
kfold = KFold(n_splits=10, shuffle=True) results = cross_val_score(estimator, X, encoded_y, cv=kfold) print("%.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
验证训练代码
调整后的estimator可以正常调用fit():
estimator.fit(X_train, Y_train) y_preds = estimator.predict(X_test)
内容的提问来源于stack exchange,提问作者Hemil Shah
相关产品推荐
相关产品推荐

