tf.keras中损失与指标的CategoricalCrossentropy差异疑问
tf.keras.losses.CategoricalCrossentropy 与 tf.keras.metrics.CategoricalCrossentropy 的核心区别
1. 计算逻辑差异
- 损失函数(Loss):以批次为单位计算平均值,再对所有批次的平均值取整体平均。无论批次内样本数量多少,每个批次的平均结果都会被平等加权到最终的
loss/val_loss中。 - 评估指标(Metric):累积整个数据集所有样本的交叉熵总和,最后直接除以总样本数得到平均值,每个样本的权重均等,不受批次划分的影响。
2. 验证集数值差异的常见原因
你遇到的验证集val_loss与val_categorical_crossentropy差异,最可能的原因是验证集样本总数无法被批次大小整除:
举个具体例子:假设验证集有1001个样本,批次大小设为32。前31个批次各有32个样本,最后1个批次只有9个样本。
val_loss计算:先算每个批次的交叉熵平均值,再把32个批次的平均值取算术平均(最后一个批次的9样本平均和前面的32样本平均被平等对待)。val_categorical_crossentropy计算:把1001个样本的交叉熵全部加起来,除以1001得到整体平均值。
如果最后一个批次的交叉熵数值和其他批次差异较大,这种加权方式的不同就会导致两个结果出现明显差距。而训练集的loss与指标数值一致,大概率是因为训练集样本总数刚好是批次大小的整数倍,两种计算方式的结果自然重合。
另外需要排查的小概率情况:
- 模型是否在验证阶段意外启用了训练模式(比如Dropout/BatchNormalization层没有切换到推理模式),但这种情况通常会导致训练集和验证集的指标都出现异常,而不是仅验证集差异。
- 是否为验证集设置了与训练集不同的样本权重,且权重处理逻辑在loss和metric中存在差异(这种情况极少发生)。
内容的提问来源于stack exchange,提问作者Seena
相关产品推荐
相关产品推荐

