如何获取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
相关产品推荐
相关产品推荐

