python - 为什么tf模型训练时的二元交叉熵损失与sklearn计算的不同?
问题描述
我正在使用 tensorflow 构建神经协同过滤推荐模型,使用二元交叉熵作为损失函数。当然,要预测的标签是二进制的。
在训练每个 epoch 时,都会打印损失函数。我有一个 for 循环,通过 epoch 训练模型,然后使用当前状态下的模型来预测测试标签,并使用 sci-kit learn 的 log_loss 函数再次计算损失。
我注意到 tensorflow 计算的损失(由 loss 显示:)始终高于 sklearn 计算的损失(由 train_loss 显示:):
这是由于这两个函数所涉及的数学略有不同吗?
解决方案
在训练循环中,Keras 测量整个 epoch 的平均损失。在此期间,模型被调整和改进,所以到一个 epoch 结束时,报告的损失是对当时损失的高估(假设模型仍在学习)。使用sklearn
,您仅计算 epoch 结束时的损失,而模型处于 epoch 结束时的状态。如果模型仍在学习,则损失sklearn
会略低,因为它只看到在 epoch 期间已调整的模型。
推荐阅读
- python - 如何在 IPython 笔记本中运行单元后清除内存
- python - valueError 是什么意思?
- firebase - Firebase Auth - 禁用用户并阻止他与后端交互
- angular - 如何在 Angular 2 中加载谷歌地图服务
- jquery - 如果类添加文本
- reactjs - “错误:创建导航器不需要参数。”
- javascript - 自动对焦后在所有输入之后再次
- metatrader4 - 以 csv 格式从 Metatrader mt4 批量导出数据
- sql - ORA-00907: 两个子查询的左连接缺少右括号
- wordpress - 从 Gutenberg 核心块中删除设置