TensorFlow Keras中add_loss与compile指定的loss如何结合计算梯度?
TensorFlow Keras 总损失计算规则
两类损失的合并逻辑
Keras 默认会直接将两类损失相加得到最终用于梯度更新的总损失,不需要手动合并:
- 第一类是
compile方法中loss参数指定的损失(示例中的重建损失r_loss) - 第二类是所有通过
add_loss方法在模型内部添加的损失项(示例中的KL散度损失kl_loss)
示例日志的数值对应关系
你给出的训练日志数值完全符合这个规则:
1272/1272 [==============================] - 249s 191ms/step - batch: 635.5000 - size: 1.0000 - loss: 5300.4540 - r_loss: 2856.8228
计算方式为:总loss = r_loss + kl_loss
代入数值可以算出本轮训练的平均KL损失约为 5300.4540 - 2856.8228 = 2443.6312。
额外说明
- 你代码中
r_loss是对单样本的空间维度求和,Keras编译时默认会对batch维度取平均,而你add_loss添加的kl_loss本身已经用tf.math.reduce_mean做了batch维度的平均,两者量纲一致,所以可以直接相加。 - 如果编译时指定了
loss_weights参数,会先对compile传入的损失乘对应权重,再和add_loss的损失相加,你没有配置这个参数所以不需要考虑加权逻辑。
内容的提问来源于stack exchange,提问作者under_the_sea_salad
相关产品推荐
相关产品推荐

