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

TensorFlow训练后调用predict()手动计算MSE远高于训练损失是什么原因

问题原因分析
  • 权重未同步问题:部分TensorFlow版本中,on_epoch_end回调触发、设置stop_training=True时,会出现当前epoch更新后的权重未完全写入模型计算图的问题,你手动计算得到的0.0277和第111轮训练输出的0.0294损失高度接近,说明你调用predict时实际使用的是第111轮训练后的权重,并非达到损失阈值的第112轮权重。
  • 训练损失统计误差:TensorFlow训练日志输出的epoch损失是训练过程中每个batch损失的滑动平均值,并非全量训练样本的精确损失,尤其是你设置了batch_size=1的情况下,单个样本的极小损失会直接拉低整轮的平均损失统计值,和全量样本的真实损失存在偏差。
  • 维度不匹配问题:model.predict(x)的输出形状默认为(样本数, 1),如果你的标签y的形状是(样本数,),部分版本sklearn的MSE计算会出现维度对齐偏差,导致损失计算结果偏高。
解决方案
  1. 修改回调逻辑,触发停止前先验证全量样本的真实损失,同时确认权重写入完成:
class stopAtLossValue(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        eps = 0.00001 
        # 直接计算全量训练集的真实损失,避免日志统计误差
        real_loss = self.model.evaluate(x, y, verbose=0)
        if real_loss <= eps:
            # 先手动保存权重,避免写入丢失
            self.model.save_weights('stop_weights.h5')
            self.model.stop_training = True

# 训练结束后加载保存的权重再推理
model.load_weights('stop_weights.h5')
  1. 计算MSE前先对齐输出维度:
pred = model.predict(x, verbose=0).flatten()
print(my_mse(y, pred))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:03