如何控制Keras Tuner Hyperband的模型数量与训练轮次?
Keras Tuner Hyperband:模型数量与训练轮次控制指南
一、控制运行的模型数量
Hyperband没有max_trials和execution_per_trial这类直接参数,它靠算法逻辑动态筛选模型,你可以通过以下方式间接控制总模型数:
max_epochs+factor:Hyperband的核心逻辑是多轮淘汰:先批量训练模型,每轮淘汰factor比例的低性能模型,留下的模型继续训练更久。max_epochs是最终存活模型的最大训练轮次,factor是每轮淘汰比例(默认3)。总模型数大致由max_epochs * log_factor(max_epochs)决定,调小这两个参数能减少总模型数量。hyperband_iterations:指定Hyperband算法重复运行的次数(默认1)。减少这个值可以直接降低总模型数,比如设为0.5只会运行半轮筛选逻辑。- 模拟
execution_per_trial:如果需要同一超参数组合多次训练取平均,可以在模型构建函数里手动循环训练,比如:def build_model(hp): model = Sequential(...) model.compile(...) # 同一超参数训练3次取平均 val_accs = [] for _ in range(3): history = model.fit(...) val_accs.append(history.history['val_accuracy'][-1]) # 返回平均精度作为评估指标 return np.mean(val_accs)
二、训练轮次的生效逻辑
Hyperband的max_epochs和tuner.search()的epochs是配合生效的:
max_epochs:定义最终存活到最后一轮的模型,能训练的最大轮次,是Hyperband淘汰流程的目标轮次。search(epochs=X):是所有训练的绝对上限。如果Hyperband流程中某阶段需要训练的轮次超过X,实际只会训练X轮就停止;如果X≥max_epochs,Hyperband会正常走完淘汰流程,最终模型训练到max_epochs轮。
正确用法示例
比如你希望最优模型最多训练50轮,那么初始化时设max_epochs=50,search()里的epochs设为不小于50的值(比如60),让Hyperband的淘汰逻辑主导训练时长:
tuner = Hyperband( build_model, objective='val_accuracy', max_epochs=50, factor=3, directory='tuner_dir', project_name='hyperband_demo' ) # epochs设为比max_epochs大的值,保证Hyperband流程不被截断 tuner.search(x_train, y_train, epochs=60, validation_data=(x_val, y_val))
如果search(epochs=30)且max_epochs=50,那么所有模型的训练轮次都不会超过30,Hyperband的淘汰流程会被提前截断。
内容的提问来源于stack exchange,提问作者Jegatheesan
相关产品推荐
相关产品推荐

