MNIST实验中KerasRegressor与RandomizedSearchCV的参数传入问题
KerasRegressor结合RandomizedSearchCV调参的正确用法
你的代码存在两处关键问题,导致参数调参无法正常工作,以下是具体修正方案:
问题1:KerasRegressor初始化参数错误
你使用model=build_model传入模型构建函数,但KerasRegressor接收模型构建函数的正确参数名是build_fn,参数名错误会导致调参逻辑无法识别要传递的参数。
问题2:模型编译未使用自定义学习率
在build_model函数中,你定义了带指定learning_rate的SGD优化器,但编译模型时却传入字符串"sgd"(这会调用默认参数的SGD优化器),导致传入的learning_rate完全不生效。
修正后的完整代码
def build_model(n_hidden, n_neurons, learning_rate): model = keras.models.Sequential() # 输入层 model.add(keras.layers.Flatten(input_shape=[28, 28])) for layer in range(n_hidden): model.add(keras.layers.Dense(n_neurons, activation="relu")) # 输出层 model.add(keras.layers.Dense(10, activation="softmax")) optimizer = keras.optimizers.SGD(learning_rate=learning_rate) model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, # 使用自定义优化器 metrics=["accuracy"]) return model # 正确初始化KerasRegressor,使用build_fn参数 keras_reg = KerasRegressor(build_fn=build_model) param_distribs = { "n_hidden": [0, 1, 2, 3], "n_neurons": np.arange(1, 100), "learning_rate": reciprocal(3e-4, 3e-2) } rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3) rnd_search_cv.fit(X_train, y_train)
额外说明
- 确保
param_distribs中的键名和build_model的参数名完全一致,RandomizedSearchCV才能正确将采样的参数传递给模型构建函数。 - 如果需要固定训练参数(如
epochs、batch_size),可以直接在KerasRegressor初始化时传入,例如:keras_reg = KerasRegressor(build_fn=build_model, epochs=20, batch_size=32);如果需要对这些参数调参,也可以将其加入param_distribs字典中。
内容的提问来源于stack exchange,提问作者Julius Ruijgrok
相关产品推荐
相关产品推荐

