GridSearchCV调参报错‘neurons为无效参数’的解决方法
KerasClassifier与GridSearchCV超参数调优报错解决
问题场景
使用GridSearchCV对Keras模型进行超参数调优,TensorFlow与Keras版本均为2.15.0,运行代码时返回错误,提示Invalid parameter neurons for estimator KerasClassifier,并建议在KerasClassifier构造函数中设置该参数。
报错信息
Invalid parameter neurons for estimator KerasClassifier. This issue can likely be resolved by setting this parameter in the KerasClassifier constructor: `KerasClassifier(neurons=2)`
问题原因
GridSearchCV会将param_grid中的参数直接传递给KerasClassifier实例,但neurons和optimizer是模型构建函数create_model的参数,并非KerasClassifier自身的参数,因此会被判定为无效参数。
解决方法
利用sklearn的双下划线参数传递规则,将模型构建函数的参数通过build_kwargs__参数名的形式加入param_grid,告诉GridSearchCV把这些参数传递给build_fn(即create_model函数)。
修改后的关键代码
- 调整参数网格
param_grid:
param_grid = { 'build_kwargs__neurons': [2, 8, 16], 'batch_size': [4, 16], 'build_kwargs__optimizer': ['SGD', 'RMSprop', 'Adam'] }
- KerasClassifier的定义无需额外修改,保持原代码即可:
model1 = KerasClassifier(build_fn=create_model, epochs=10, verbose=1)
完整修改后代码
# 定义Keras模型构建函数 def create_model(neurons, optimizer): model = Sequential() model.add(Dense(neurons, input_dim=30, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model # 定义参数范围(使用build_kwargs__前缀传递模型构建参数) param_grid = { 'build_kwargs__neurons': [2, 8, 16], 'batch_size': [4, 16], 'build_kwargs__optimizer': ['SGD', 'RMSprop', 'Adam'] } # 包装Keras模型为sklearn兼容的分类器 model1 = KerasClassifier(build_fn=create_model, epochs=10, verbose=1) # 初始化网格搜索 grid = GridSearchCV(estimator=model1, param_grid=param_grid, n_jobs=1, cv=3) # 执行网格搜索 grid_result = grid.fit(X, Y) # 输出结果 print("Best accuracy of: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) means = grid_result.cv_results_['mean_test_score'] stds = grid_result.cv_results_['std_test_score'] params = grid_result.cv_results_['params'] for mean, stdev, param in zip(means, stds, params): print("%f (%f) with: %r" % (mean, stdev, param)) # 加载最优模型并预测 best_model = grid_result.best_estimator_ y_pred = best_model.predict(X) y_pred = (y_pred > 0.5) # 生成混淆矩阵 from sklearn.metrics import confusion_matrix import seaborn as sns cm = confusion_matrix(Y, y_pred) sns.heatmap(cm, annot=True)
内容的提问来源于stack exchange,提问作者Beginner_coder
相关产品推荐
相关产品推荐

