3

我有一个二元分类问题。我正在使用来自tensorflow.losses.log_loss.

要检查,我使用sklearn.metrics.log_loss. 大多数时候,这两个函数给出相同的结果(只有 dtype 不同)。在某些情况下,sklearn函数在返回正确值的NaN同时返回。tf.losses.log_loss

数据在这里: https ://pastebin.com/BvDgDnVT

代码:

import sklearn.metrics
import tensorflow as tf
y_true = [... see pastebin link]
y_pred = [... see pastebin link]
loss_sk = sklearn.metrics.log_loss(y_true, y_pred, labels=[0, 1]) # -> returns NaN
with tf.Session() as sess:
    loss_tf = tf.losses.log_loss(y_true, y_pred).eval(session=sess) # -> returns 0.0549

好像发生了一些log(0)事情,但是为什么tensorflow没有这个问题呢?

4

2 回答 2

5

将两个数组的 dtype 更改为 64 位浮点数可以修复它

dtype=np.float64

例如添加y_pred = y_pred.astype(np.float64)

于 2018-05-03T21:50:03.547 回答
2

解决问题的另一种方法是提供eps=1e-7to log_loss,这是一个更合适的 epsilonfloat32并且是 tensorflow 使用的。然而,Scikit1e-15用作默认值(期望float64)。

于 2020-02-20T10:43:48.033 回答