Keras Tuner最优模型评估MSE与结果汇总得分不一致问题
问题:Keras Tuner最优模型得分与实际评估MSE不一致
我正在尝试1)调整超参数,2)保存最优模型。但发现Keras Tuner输出的“最优模型”得分,与实际评估该模型得到的MSE不一致。相关代码及输出如下:
tuner = RandomSearch( hypermodel = build_model, max_trials = 5, executions_per_trial = 5, hyperparameters = hp, tune_new_entries = T, objective = 'mse', project_name = project_name, overwrite = TRUE ) tuner %>% fit_tuner(x = x, y = y, epochs = 100, validation_data = list(x_val, y_val)) best_model <- tuner %>% get_best_models(1) tuner %>% results_summary(1) best_model[[1]] %>% evaluate(x=x, y=y)
输出结果
# Output from tuner %>% results_summary(1): Showing 1 best trials <keras_tuner.engine.objective.Objective object at 0x0000026FAE07C610> Trial summary Hyperparameters: num_layers: 3 units: 30 Score: 0.23338192105293273 # Output from best_model[[1]] %>% evaluate(x=x, y=y): 32/32 [==============================] - 0s 676us/step - loss: 0.1719 - mse: 0.1719 loss mse 0.1718763 0.1718763
results_summary中的Score与评估最优模型得到的mse存在差异,我认为二者应该一致,请问我忽略了什么?
补充数据生成代码
a = rnorm(1000) b = rnorm(1000) c = rnorm(1000) y = matrix(c(a,b,c), nrow = 1000) x = lapply(1:20, function(i) y[,1]*i^2 + y[,2]*i + y[,3]) %>% unlist() %>% matrix(nrow = 1000)
x_val和y_val的定义方式类似。
解答
核心原因:评估数据集不一致
Keras Tuner在results_summary中展示的Score是基于你传入的validation_data(即x_val和y_val)计算的,而你后续用evaluate(x=x, y=y)评估的是训练集数据。训练集和验证集的样本不同,模型在两个数据集上的MSE自然会有差异,这是最主要的原因。
次要原因:多次执行的平均得分
你设置了executions_per_trial = 5,这意味着每个超参数组合会被独立训练5次,results_summary中的Score是这5次训练在验证集上MSE的平均值。而get_best_models()返回的是该超参数组合下某次训练得到的模型(通常是表现最优的那一次),这个单个模型在验证集上的得分本身就可能和平均得分有小幅差异,再加上你用训练集评估,差异被进一步放大。
验证方法
- 用验证集评估最优模型,结果会更接近Score:
best_model[[1]] %>% evaluate(x=x_val, y=y_val)
这个结果应该和results_summary里的0.2333更接近(可能有小幅波动,因为是单次训练的模型,而非5次的平均)。
- 确认目标函数的评估逻辑:Keras Tuner默认使用验证集的指标作为优化目标,如果你想让Score基于训练集,需要在
fit_tuner中调整objective的评估数据集,但这通常不推荐(容易过拟合)。
内容的提问来源于stack exchange,提问作者Mas
相关产品推荐
相关产品推荐

