Keras训练中分类交叉熵作损失和指标结果不同的原因
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=optimiser, metrics=['accuracy', 'categorical_crossentropy'])
上述代码写法没有问题,出现损失值与监控的categorical_crossentropy数值不一致属于Keras训练的正常现象,常见原因如下:
- 计算时序不同:损失值是每个训练批次权重更新前计算得到的,而
metrics中统计的分类交叉熵是权重更新后,对整个epoch所有批次计算的均值,批次间权重的迭代调整会直接导致二者数值出现偏差。 - 正则项计入规则不同:模型最终输出的损失值会自动叠加所有内置正则项的数值(包括卷积层/全连接层的L1/L2正则、Dropout、BatchNormalization层对应的正则损失等),但监控指标里的
categorical_crossentropy仅统计纯分类交叉熵的数值,不包含任何正则项贡献,这是二者出现明显差异的最核心原因。 - 统计范围差异:如果对比的是训练集损失值和验证集的分类交叉熵指标,二者数据源本身不同,数值自然存在差异;即使对比的是同属训练集的两个数值,也会受上述两个因素影响。
- 浮点累积误差:整个epoch的指标是多个批次数值的平均值,多轮浮点运算的累积误差也可能导致二者出现小幅的数值偏差。
- 版本实现差异:部分旧版本Keras(2.3版本之前)对训练损失的平滑统计逻辑和指标的统计逻辑存在差异,也可能导致二者数值不一致。
内容的提问来源于stack exchange,提问作者Stupid420
相关产品推荐
相关产品推荐

