2017-03-07 4 views
4

Hi Ich versuche in Tensorflow zu kommen und mich ein bisschen dumm zu fühlen. Unterscheidet sich log_loss in TF von sklearn's?Unterschied zwischen Tensorflow und Scikitlearn log_loss function implementation

Hier sind einige Linien von meinem Code, wie ich bin Berechnung:

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.})) 

Ausgang I

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 

wie bekommen scheint, während tf.log_loss konvergiert sk.log_loss divergiert.

+0

Eine Frage, diese Funktion in Bezug auf. Kann es mit einem Autoencoder verwendet werden? d.h. die Vorhersagen und Beschriftungen sind beide gleichgroße Bilder? – Qubix

Antwort

0

Ich hatte das gleiche Problem. Nachdem wir den Quellcode tf.losses.log_loss, seine key lines Show wat los ist, nach oben:

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

Es ist Binärlog-Verlust (dh jede Klasse nicht ausschließliche betrachtet) eher als Multi-Class-Log- Verlust.

Da ich mit Wahrscheinlichkeiten arbeitete (anstatt logits), konnte ich tf.nn.softmax_cross_entropy_with_logits nicht verwenden (obwohl ich Logarithmus angewendet haben könnte). Meine Lösung von Hand log-Verlust zu realisieren war:

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

Siehe auch:

Verwandte Themen