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

TensorFlow中损失计算机制解析:自定义MSE与内置函数计算值不一致问题排查

Why does my manual MSE print differ from TensorFlow's reported loss?

你看到的差异根本不是计算错误,而是混淆了「单个batch的损失值」和「训练过程中累计的平均损失值」!让我拆解清楚:

1. 差异的直接原因

你的自定义损失函数obj里,tf.print(tf.math.reduce_mean(loss))打印的是当前正在处理的这个batch的平均MSE;而Keras在训练日志中显示的loss,是从当前epoch开始,到已经处理完的所有batch的损失的累计平均值(因为你的batch_size固定为20,所以就是算术平均)。

拿你给出的训练输出举例:
你打印的前7个batch的损失值分别是:0.349255413、0.449805915、0.453376621、0.500476539、0.294586331、0.269146353、0.358534873。
把这些值求和后除以7:

(0.3492 + 0.4498 + 0.4534 + 0.5005 + 0.2946 + 0.2691 + 0.3585) /7 ≈ 0.3822

这个结果和Keras显示的loss: 0.3822完全一致!第一个batch时,累计平均就是它自己,所以完全匹配;后面随着batch增多,累计平均会融合之前所有batch的损失,自然和当前单个batch的损失不一样。

2. TensorFlow/Keras的损失计算机制

这里帮你理清背后的逻辑:

  • 损失函数返回值的处理:当你的损失函数返回形状为(batch_size,)的张量(每个样本的单独损失)时,Keras会自动对这个张量求平均,得到整个batch的损失值——这个值就是你打印的tf.math.reduce_mean(loss),也是用来计算梯度、更新模型权重的核心数值。
  • 日志显示的设计逻辑:Keras默认显示的是累计平均损失,而不是单个batch的损失,目的是让你更直观地观察整个epoch的损失变化趋势,避免单个batch的随机波动干扰判断。如果batch_size不固定,它还会按样本数加权计算平均。
  • tf.keras.losses.mean_squared_error的行为:这个函数会对每个样本的最后一维计算MSE,返回每个样本的损失值(形状(batch_size,))。比如你的输出是(m,1),每个样本的MSE就是预测值和真实值的平方差(对1个元素求平均就是它本身),你手动计算的batch平均和Keras自动计算的完全一致。

小建议

如果你想在训练时直接看到每个batch的真实损失,可以自定义一个Callback来打印,或者调整你的打印逻辑。记住Keras默认显示的累计平均是正常设计,不是计算bug哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:32:49