2017-03-07 33 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) 

參見:

相關問題