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

Why is the binary cross entropy loss during training of tf model different than that calculated by sklearn?

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

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

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

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

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