首页 > 解决方案 > 为什么tf模型训练时的二元交叉熵损失与sklearn计算的不同?

问题描述

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

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

我注意到 tensorflow 计算的损失(由 loss 显示:)始终高于 sklearn 计算的损失(由 train_loss 显示:): 在此处输入图像描述

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

标签: pythontensorflowkerasscikit-learncross-entropy

解决方案


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


推荐阅读