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

为何神经网络网格搜索epochs时每个参数会重复运行三次?

为啥每个epochs参数会跑三次?原因和解决办法看这里

嘿,这事儿其实是GridSearchCV默认的交叉验证行为导致的——它默认用3折交叉验证(也就是cv=3),所以你指定的每个epochs值(10、50、100)都会在3个不同的训练/验证数据子集上各跑一遍,所以每个参数组合就会执行3次啦。

背后的逻辑

GridSearchCV的核心目的是帮你评估参数的泛化能力,默认的3折交叉验证会把你的x_train分成3份:每次用其中2份训练模型,剩下1份用来验证效果,循环3次后取这3次的平均得分作为该参数组合的最终表现。这就是你看到重复训练的原因,其实是交叉验证的正常流程哦。

怎么调整?

如果你真的想让每个参数只跑一次(不过真心不推荐这么做,因为会失去交叉验证带来的泛化能力评估,结果会很不可靠),可以在创建GridSearchCV的时候显式设置cv=1:

grid = GridSearchCV(estimator=KerasRegressor(build_fn=build_model), 
                    param_grid=param_grid,
                    cv=1)  # 改成1折交叉验证,每个参数只执行一次

更合理的做法是接受交叉验证的机制,毕竟它能帮你选到更靠谱的参数。要是你想调整折数,比如改成5折,只要把cv设成5就行。

另外提个小建议:你的KerasRegressor没设置verbose的话,默认会输出每一轮的训练日志,这也会让你感觉重复训练的次数更多。如果想减少日志输出,可以初始化的时候加个verbose=0:

KerasRegressor(build_fn=build_model, verbose=0)

再确认下你的代码

你的模型构建和网格搜索代码本身都没问题,就是默认交叉验证的锅:

模型构建函数:

def build_model(): 
    print('building DNN architecture') 
    model = Sequential() 
    model.add(Dropout(0.02, input_shape=(150,))) 
    model.add(Dense(8, init='normal', activation='relu')) 
    model.add(Dropout(0.02)) 
    model.add(Dense(16, init='normal', activation='relu')) 
    model.add(Dense(1, init='normal')) 
    model.compile(loss='mean_squared_error', optimizer='adam') 
    print('model succesfully compiled') 
    return model 

网格搜索代码:

from sklearn.model_selection import GridSearchCV 
epochs = [10,50,100] 
param_grid = dict(epochs=epochs) 
grid = GridSearchCV(estimator=KerasRegressor(build_fn=build_model), param_grid=param_grid) 
grid_result = grid.fit(x_train, y_train) 
grid_result.best_params_ 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:14