为啥tf模型训练时的二元交叉熵损失与sklearn计算的不同?

Posted

技术标签:

【中文标题】为啥tf模型训练时的二元交叉熵损失与sklearn计算的不同?【英文标题】:Why is the binary cross entropy loss during training of tf model different than that calculated by sklearn?为什么tf模型训练时的二元交叉熵损失与sklearn计算的不同? 【发布时间】:2021-11-28 09:58:08 【问题描述】:

我正在使用 tensorflow 构建神经协同过滤推荐模型,使用二元交叉熵作为损失函数。要预测的标签当然是二进制的。

在训练每个 epoch 时,会打印损失函数。我有一个 for 循环,逐个训练模型 epoch,然后使用当前状态下的模型来预测测试标签,并使用 sci-kit learn 的 log_loss 函数再次计算损失。

我注意到 tensorflow 计算的损失(由 loss 显示:)始终高于 sklearn 计算的损失(由 train_loss 显示:):

这是因为这两个函数所涉及的数学略有不同吗?

【问题讨论】:

【参考方案1】:

在训练循环中,Keras 测量整个 epoch 的平均损失。在此期间,模型被调整和改进,所以到一个 epoch 结束时,reported loss 是对当时损失的高估(假设模型仍在学习)。使用sklearn,您仅计算时期结束时的损失,模型处于时期结束时的状态。如果模型仍在学习,sklearn 的损失会略低,因为它只看到在 epoch 期间调整过的模型。

【讨论】:

以上是关于为啥tf模型训练时的二元交叉熵损失与sklearn计算的不同?的主要内容,如果未能解决你的问题,请参考以下文章

Sigmoid 与二元交叉熵损失

为啥训练多类语义分割的unet模型中的分类交叉熵损失函数非常高?

自定义 keras 损失函数二元交叉熵给出不正确的结果

为啥我不能将交叉熵损失用于多标签?

交叉熵 相关链接

pytorch二元交叉熵损失函数 nn.BCELoss() 与 torch.nn.BCEWithLogitsLoss()