Tensorflow 和 Scikitlearn log_loss 函数实现的区别

Posted

技术标签:

【中文标题】Tensorflow 和 Scikitlearn log_loss 函数实现的区别【英文标题】:Difference between Tensorflow and Scikitlearn log_loss function implementation 【发布时间】:2017-07-28 06:16:14 【问题描述】:

嗨,我正在尝试进入 tensorflow,感觉有点笨。 TF中的log_loss和sklearn的不同吗?

以下是我的代码中的一些行,我是如何计算的:

from sklearn.metrics import log_loss

tmp = np.array(y_test)
y_test_t = np.array([tmp, -(tmp-1)]).T[0]

tf_log_loss = tf.losses.log_loss(predictions=tf.nn.softmax(logits), labels=tf_y)

with tf.Session() as sess:

    # training

    a = sess.run(tf.nn.softmax(logits), feed_dict=tf_x: xtest, keep_prob: 1.)
    print("    sk.log_loss: ", log_loss(y_test, a,eps=1e-7 ))
    print("    tf.log_loss: ", sess.run(tf_log_loss, feed_dict=tf_x: xtest, tf_y: y_test_t, keep_prob: 1.))

我得到的输出

Epoch  7, Loss:     0.4875 Validation Accuracy: 0.818981
    sk.log_loss:  1.76533018874
    tf.log_loss:  0.396557
Epoch  8, Loss:     0.4850 Validation Accuracy: 0.820738
    sk.log_loss:  1.77217639627
    tf.log_loss:  0.393351
Epoch  9, Loss:     0.4835 Validation Accuracy: 0.823374
    sk.log_loss:  1.78479079656
    tf.log_loss:  0.390572

似乎tf.log_loss 收敛,sk.log_loss 发散。

【问题讨论】:

关于此功能的问题。它可以与自动编码器一起使用吗?即预测和标签都是相同大小的图像? 【参考方案1】:

我遇到了同样的问题。查了tf.losses.log_loss的源码,它的key linesshow wat正在进行:

losses = - math_ops.multiply(labels, math_ops.log(predictions + epsilon))
    - math_ops.multiply((1 - labels), math_ops.log(1 - predictions + epsilon))

它是binary log-loss(即每个类都被认为是非排他性的)而不是multi-class log-loss

当我使用概率(而不是 logits)时,我不能使用 tf.nn.softmax_cross_entropy_with_logits(虽然,我可以应用对数)。 我的解决方案是手动实现日志丢失:

loss = tf.reduce_sum(tf.multiply(- labels, tf.log(probs))) / len(probs)

另见:

https://github.com/tensorflow/tensorflow/issues/2462 difference between tensorflow tf.nn.softmax and tf.nn.softmax_cross_entropy_with_logits

【讨论】:

以上是关于Tensorflow 和 Scikitlearn log_loss 函数实现的区别的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 高级估计器的预处理数据集

sklearn.preprocessing 中 LabelEncoder 的类似方法?

在训练中使用 scikit learn 进行神经网络与 Tensorflow

Ubuntu下安装scikit-learn

GridSearchCV (scikit learn) 确定超参数

scikitlearn库中调用K近邻算法的操作步骤