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

Keras中MSE损失与自定义MSE指标计算结果为何不一致?

为什么Keras中内置MSE损失和自定义MSE指标结果不一致?

这是个挺常见的坑,结合你的数值差异(损失6.07 vs 指标0.47),我梳理几个最可能的原因:

1. 损失是「当前batch的即时平均」,指标是「整个epoch的累积平均」

Keras训练时控制台显示的loss是当前正在处理的单个batch的平均损失,而自定义指标是整个epoch所有样本的平均结果。如果你的模型收敛速度很快——比如第一个batch损失冲到6.07,后面的batch损失快速降到0.47左右——那么整个epoch的指标平均就会远低于初期batch的损失值。

验证方法:看看训练日志的最后几个batch的loss,是不是已经降到0.47附近了?如果是,那你看到的6.07只是训练初期的batch损失,指标才是整个epoch的真实平均。

2. 自定义指标未处理样本/类别权重

如果你训练时用了sample_weight或class_weight,Keras的内置MSE损失会自动应用这些权重计算加权平均,但如果你的自定义指标只是直接复制losses.py里的代码(比如仅写K.mean(K.square(y_true - y_pred), axis=-1)),它不会自动处理权重,导致指标是未加权的原始MSE,而损失是加权后的MSE。

举个例子:假设你给少数高损失样本设置了极高权重,损失会被拉高到6.07,但未加权的指标是所有样本的平均,结果自然会低很多(0.47)。

解决方法:如果要让自定义指标支持权重,需要用tf.keras.metrics.Metric类手动实现:

import tensorflow as tf

class WeightedMSE(tf.keras.metrics.Metric):
    def __init__(self, name='weighted_mse', **kwargs):
        super().__init__(name=name, **kwargs)
        self.total_sse = self.add_weight(name='total_sse', initializer='zeros')
        self.total_weight = self.add_weight(name='total_weight', initializer='zeros')

    def update_state(self, y_true, y_pred, sample_weight=None):
        sse = tf.square(y_true - y_pred)
        if sample_weight is not None:
            sample_weight = tf.cast(sample_weight, tf.float32)
            sse = tf.multiply(sse, sample_weight)
            self.total_weight.assign_add(tf.reduce_sum(sample_weight))
        else:
            self.total_weight.assign_add(tf.cast(tf.size(y_true), tf.float32))
        self.total_sse.assign_add(tf.reduce_sum(sse))

    def result(self):
        return self.total_sse / self.total_weight

然后在compile时使用这个类:model.compile(loss='mse', metrics=[WeightedMSE()])

3. 自定义指标的维度平均逻辑有误

虽然你说复制了losses.py的代码,但可能不小心改了平均维度。比如内置mean_squared_error默认对最后一个维度(特征维度)求平均得到每个样本的MSE,再对batch内样本求平均;如果你的自定义代码写成了K.mean(K.square(y_true - y_pred))(未指定axis=-1),会对所有维度(batch+特征)求平均。不过这种情况导致的差异通常不会这么大,优先级低于前两个原因。

总结

先检查训练日志的batch loss变化,看是不是初期高后期低;如果不是,再确认有没有使用样本/类别权重,自定义指标有没有处理权重——这两个是导致你看到巨大数值差异的最可能原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:34:12