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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:33:43