关于Keras中loss=mean_squared_error与MeanSquaredError指标差异的疑问
你遇到的差异核心来自计算平均的方式不同,两者的MSE计算逻辑本身是一致的,但统计范围和平均方法有区别:
训练loss(mean_squared_error):是对每个batch计算的loss值做算术平均——即把每个batch输出的loss加起来,再除以batch的总数。如果你的数据集最后一个batch的样本数比其他batch少,这个平均会给样本多的batch更高的权重,因为每个batch不管样本多少,都占“1份”权重。
metrics中的MeanSquaredError:是对整个epoch内所有样本的平方误差做全局平均——先把每个样本的预测值与真实值的平方误差全部累加,再除以总样本数,每个样本的权重完全一致,不受batch大小影响。
对应你的训练输出的解释
你的训练日志里loss略高于metrics值,说明部分batch(比如样本数较少的最后几个batch)的loss相对偏高。因为loss的平均方式会让这些batch的权重和大batch一样,拉高了整体平均值;而metrics是按样本数平均,这些小batch的影响被稀释,所以结果更低。
验证方法
如果把数据集的batch设置为等大小(比如在tf.data.Dataset中设置drop_last=True,丢弃最后一个样本数不足的batch),此时每个batch的样本数完全相同,loss和metrics的结果会几乎完全一致。
验证集的情况同理
日志中的val_loss和val_mean_squared_error差异也是同样的原因:val_loss是验证集各batch loss的算术平均,val_metric是验证集所有样本的全局MSE平均。
内容的提问来源于stack exchange,提问作者ToothlessNoMore

