来自 sklearn 的 log_loss 给出 nan,而 tensorflow.losses.log_loss 有效
log_loss from sklearn gives nan, while tensorflow.losses.log_loss works
我有一个二元分类问题。
我正在使用 tensorflow.losses.log_loss
中的 log_loss。
为了检查,我使用 sklearn.metrics.log_loss
。大多数时候,这两个函数给出相同的结果(只是 dtype 不同)。在某些情况下,sklearn
函数 returns NaN
而 tf.losses.log_loss
returns 是正确的值。
数据在这里:
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没有这个问题呢?
将两个数组的 dtype 更改为 64 位浮点数可以修复它
dtype=np.float64
例如添加y_pred = y_pred.astype(np.float64)
另一种解决问题的方法是将 eps=1e-7
提供给 log_loss
,这是 float32
更合适的 epsilon,也是 tensorflow 使用的。
然而,Scikit 默认使用 1e-15
(期望 float64
)。
我有一个二元分类问题。
我正在使用 tensorflow.losses.log_loss
中的 log_loss。
为了检查,我使用 sklearn.metrics.log_loss
。大多数时候,这两个函数给出相同的结果(只是 dtype 不同)。在某些情况下,sklearn
函数 returns NaN
而 tf.losses.log_loss
returns 是正确的值。
数据在这里: 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没有这个问题呢?
将两个数组的 dtype 更改为 64 位浮点数可以修复它
dtype=np.float64
例如添加y_pred = y_pred.astype(np.float64)
另一种解决问题的方法是将 eps=1e-7
提供给 log_loss
,这是 float32
更合适的 epsilon,也是 tensorflow 使用的。
然而,Scikit 默认使用 1e-15
(期望 float64
)。