You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RandomizedSearchCV与KerasClassifier时遇参数无效错误求助

解决KerasClassifier与RandomizedSearchCV参数调优的ValueError问题

问题根源

错误的核心是RandomizedSearchCV无法正确识别模型构建函数的参数传递逻辑,同时混淆了KerasClassifier自身参数和模型自定义参数的传递方式。

正确解决方案

步骤1:分离两类参数

batch_size是KerasClassifier传递给fit()的内置参数,不需要放到模型构建函数中;仅将学习率lr保留为模型构建函数的自定义参数:

def create_model_v4(lr):  
    np.random.seed(1337)
    model = Sequential()
    model.add(Dense(256,activation='relu',input_dim = X_train.shape[1]))
    # 省略中间层代码
    model.add(Dense(32,activation='relu')) 
    model.add(Dense(1, activation='sigmoid'))

    # 编译模型
    optimizer = tf.keras.optimizers.Adam(learning_rate=lr)
    model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
    return model

步骤2:规范参数搜索字典格式

RandomizedSearchCV需要通过build_fn__参数名的格式传递模型构建函数的自定义参数,KerasClassifier的内置参数直接使用参数名即可:

keras_estimator = KerasClassifier(build_fn=create_model_v4, verbose=1)

# 定义随机搜索参数
param_random = {
    'batch_size': [32, 64, 128],
    'build_fn__lr': [0.01, 0.1, 0.001]
}

步骤3:执行参数搜索

保持原有RandomizedSearchCV执行代码不变:

kfold_splits = 3
random = RandomizedSearchCV(estimator=keras_estimator,  
                           verbose=1,
                           cv=kfold_splits,  
                           param_distributions=param_random,
                           n_jobs=-1)
random_result = random.fit(X_train, y_train, validation_split=0.2, verbose=1) 

# 输出结果
print("Best: %f using %s" % (random_result.best_score_, random_result.best_params_))
means = random_result.cv_results_['mean_test_score']
stds = random_result.cv_results_['std_test_score']
params = random_result.cv_results_['params']

额外说明

  • 若想验证当前可用参数,可执行print(keras_estimator.get_params().keys()),查看包含build_fn__lr的完整参数列表
  • 使用n_jobs=-1并行训练时,建议将随机种子改为线程安全的tf.random.set_seed(1337),避免并行过程中的随机性异常

内容的提问来源于stack exchange,提问作者ericclapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:31:12