使用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
相关产品推荐
相关产品推荐

