我有二进制分类问题。
我正在使用tensorflow.losses.log_loss
中的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没有这个问题呢?
答案 0 :(得分:3)
将两个数组的dtype更改为64位浮点数将其修复
dtype=np.float64
答案 1 :(得分:2)
解决此问题的另一种方法是将eps=1e-7
提供给log_loss
,这对于float32
来说是更合适的epsilon,并且是tensorflow所使用的。
但是,Scikit使用1e-15
作为默认值(期望float64
)。