VAE训练USPS数据集时训练损失与验证损失为负问题求助
负损失问题根因与修复方案
核心原因
1. 损失权重与图像尺寸不匹配
你的VAE损失由两部分组成:
- 重建损失:采用逐像素平均二值交叉熵计算,16×16的USPS图像总像素量仅为28×28 MNIST的33%,平均后的重建损失数值天然远小于MNIST场景下的数值
- KL散度损失:你自定义的KL损失代码自带负号,且使用了固定的
-5e-4全局系数,没有随图像尺寸调整权重
当KL损失的负向绝对值超过极小的重建损失值时,总损失就会变为负数。你观察到的第2轮后损失不再变化的现象,也是两部分损失都进入收敛区间导致的。
2. 数据集归一化重复
extra_keras_datasets库返回的USPS数据集默认已经完成0~1范围的归一化,你代码中额外执行的x_train = x_train / 255操作会把所有像素值压缩到0~0.0039的极小区间,导致重建任务难度极低,重建损失趋近于0,进一步放大了KL损失的负向影响。
修复步骤
- 先删除多余的归一化操作,加载数据集后先打印
x_train.max()确认取值范围,仅在原始值为0~255时再做除以255的归一化。 - 调整KL损失的计算为标准VAE实现,消除错误的负号前缀:
kl_loss = 0.5 * K.mean(K.square(z_mu) + K.exp(z_sigma) - 1 - z_sigma, axis=-1)
- 重建损失改为逐像素求和而非平均,消除图像尺寸带来的数值差异:
recon_loss = keras.metrics.binary_crossentropy(x, z_decoded) * img_width * img_height
按上述步骤修改后,损失会回归正值,训练也会正常收敛。
内容的提问来源于stack exchange,提问作者chuky pedro
相关产品推荐
相关产品推荐

