为何Keras模型evaluate()结果与训练最后一轮epoch的结果差异巨大
问题原因分析
1. model.evaluate 调用逻辑错误(核心原因)
Keras框架下model.evaluate()的参数规则固定为:
- 第一个参数传入模型的输入特征
- 第二个参数传入和输入对应的真实标签值
- 函数内部会自动调用模型计算输入对应的预测结果,再和传入的真实标签计算损失、评估指标。
你当前的调用model.evaluate((m * test_x + b), predict_y)完全不符合参数规则:
- 你把
m*test_x + b(也就是测试集的真实标签test_y)当成了输入传给模型 - 把你提前计算好的模型预测值
predict_y当成了真实标签 - 相当于强制模型完成一个完全无关的新任务,自然会得到异常高的MAE数值。
2. 存在特征未归一化的泛化风险
你的训练输入范围是02000,测试输入范围是20002400,属于训练集完全没有覆盖到的外推区间,ReLU激活函数在这类场景下很容易出现精度下跌的问题,哪怕修正评估逻辑,也可能出现测试指标远差于训练指标的情况,可以通过特征归一化缓解。
修正方案
修正评估逻辑
你可以二选一使用正确的评估方式:
- 直接调用
model.evaluate(),不需要提前计算预测值:
test_y_true = m * test_x + b print("Evaluate Testing : ", model.evaluate(test_x, test_y_true))
- 如果你已经提前算出了预测值,直接手动计算MAE即可:
test_y_true = m * test_x + b mae = np.mean(np.abs(predict_y.flatten() - test_y_true)) print("手动计算MAE:", mae)
可选优化:特征归一化
将输入特征缩放到0~1区间,提升模型外推能力:
# 训练集归一化 train_x_norm = train_x / 2000 model.fit(train_x_norm, train_y, epochs=250) # 测试集用相同规则归一化 test_x_norm = test_x / 2000 predict_y = model.predict(test_x_norm)
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

