2017-03-07 74 views
4

嗨,我试图进入张量流,感觉有点愚蠢。 TF中的log_loss与sklearn的不同?Tensorflow和Scikitlearn log_loss函数实现之间的区别

下面是我的一些代码,我如何计算:

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发散。

+0

关于这个功能的问题。它可以与autoencoder一起使用吗?即预测和标签都是相同尺寸的图像? – Qubix

回答

0

我有同样的问题。仰视的tf.losses.log_loss源代码后,其key lines显示笏是怎么回事:

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

这是二进制日志丢失(即每类被视为非排他性的),而不是多级对数损失

由于我使用概率(而不是logits),我不能使用tf.nn.softmax_cross_entropy_with_logits(尽管我可以应用对数)。 我的解决方案是实现登录损失手:

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

参见:

相关问题