为啥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计算的不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥训练多类语义分割的unet模型中的分类交叉熵损失函数非常高?
pytorch二元交叉熵损失函数 nn.BCELoss() 与 torch.nn.BCEWithLogitsLoss()