我有一个二元分类问题。我正在使用来自tensorflow.losses.log_loss
的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没有这个问题呢?
发布于 2018-05-03 21:50:03
将两个数组的dtype更改为64位浮点数。
dtype=np.float64
例如,添加y_pred = y_pred.astype(np.float64)
发布于 2020-02-20 10:43:48
解决这个问题的另一种方法是向eps=1e-7
提供log_loss
,这是float32
更合适的epsilon,也是tensorflow使用的。但是,Scikit使用1e-15
作为缺省值(预期为float64
)。
https://stackoverflow.com/questions/50157689
复制相似问题