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

如何获取Keras Tuner训练得到的最优模型对应的训练轮次epochs值

Keras Tuner 如何查询最优模型早停实际训练的epoch数

我使用Keras Tuner的RandomSearch类进行最优模型搜索,调用fit()时配置了EarlyStopping回调,相关代码如下:
目前我需要查询最优模型实际完成训练的epochs数量,以便使用该轮次数值在包含验证集的完整训练集上重训最优模型,由于重训时不再设置验证集,无法使用早停策略终止训练。

tuner = kt.RandomSearch(
    build_model,
    objective="val_accuracy",
    max_trials=5,
    overwrite=True,
    directory="test_search",
    project_name="test_project"
)
tuner.search(
    X_train, y_train, epochs=100,
    validation_data=(X_valid, y_valid),
    callbacks=[tf.keras.callbacks.EarlyStopping(patience=10)]
)
best_trials = random_search_tuner.oracle.get_best_trials(num_trials=3)

解决方法

Keras Tuner的每一个试验(Trial)对象都保存了完整的训练过程指标记录,你可以通过以下两种方式获取最优模型的最佳训练轮次:

方法1:直接调用Trial的best_step属性

这是最简便的方式,best_step属性直接返回该试验表现最优对应的epoch序号:

# 修正原代码变量名不一致的问题,之前定义的tuner变量名是tuner而非random_search_tuner
best_trials = tuner.oracle.get_best_trials(num_trials=3)
best_trial = best_trials[0]

optimal_epochs = best_trial.best_step
print(f"最优训练轮次:{optimal_epochs}")

方法2:从训练历史指标中手动计算

如果你需要确认完整的训练过程精度变化,可以从trial的metrics中提取验证集精度序列,找到最大值对应的轮次:

val_acc_records = best_trial.metrics.get_history('val_accuracy')
val_acc_list = [record.value for record in val_acc_records]
# 索引从0开始,epoch计数从1开始,所以结果要+1
optimal_epochs = val_acc_list.index(max(val_acc_list)) + 1

后续重训操作

拿到最优轮次后,你可以直接用该数值在全量训练集上训练模型:

# 用最优超参数构建模型
best_hp = best_trial.hyperparameters
full_train_model = build_model(best_hp)

# 在合并后的训练+验证集上训练指定轮次
full_train_model.fit(
    X_full_train, y_full_train,
    epochs=optimal_epochs
)

注意事项

建议你在EarlyStopping回调中添加restore_best_weights=True参数:

callbacks=[tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)]

添加该参数后,搜索阶段的试验会自动回滚到最优轮次的权重,避免拿到的是早停触发时最后几轮的次优权重,同时best_step属性的返回值也会更准确。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:15:06