2016-06-10 7 views
13

Ich arbeite an einem Multi-Label-Problem und ich versuche, die Genauigkeit meines Modells zu bestimmen.Tensorflow, Multi-Label-Genauigkeitsberechnung

Mein Modell:

NUM_CLASSES = 361 

x = tf.placeholder(tf.float32, [None, IMAGE_PIXELS]) 
y_ = tf.placeholder(tf.float32, [None, NUM_CLASSES]) 

# create the network 
pred = conv_net(x) 

# loss 
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(pred, y_)) 

# train step 
train_step = tf.train.AdamOptimizer().minimize(cost) 

i die Genauigkeit auf zwei verschiedene Arten
berechnen wollen -% aller Labels, die richtig vorhergesagt werden -% der Bilder, in denen alle Etiketten

korrekt vorhergesagt werden Leider kann ich nur den Prozentsatz aller korrekt berechneten Etiketten berechnen.

ich diesen Code dachte% der Bilder berechnen würde, wo alle Etiketten richtig

correct_prediction = tf.equal(tf.round(pred), tf.round(y_)) 

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

und diesen Code% aller Etiketten vorhergesagt werden, die richtig

pred_reshape = tf.reshape(pred, [ BATCH_SIZE * NUM_CLASSES, 1 ]) 
y_reshape = tf.reshape(y_, [ BATCH_SIZE * NUM_CLASSES, 1 ]) 

correct_prediction_all = tf.equal(tf.round(pred_reshape), tf.round(y_reshape)) 

accuracy_all = tf.reduce_mean(tf.cast(correct_prediction_all, tf.float32)) 

irgendwie die Kohärenz der Etiketten vorhergesagt werden die Zugehörigkeit zu einem Bild ist verloren und ich bin mir nicht sicher warum.

Antwort

18

Ich glaube, der Fehler in Ihrem Code ist in: correct_prediction = tf.equal(tf.round(pred), tf.round(y_)).

pred sollte unskalierte logits (d. H. Ohne ein endgültiges Sigmoid) sein.

Hier wollen Sie die Ausgabe von sigmoid(pred) und y_ (beide im Intervall [0, 1]) vergleichen, so müssen Sie schreiben:

  • Genauigkeit Mean:

    correct_prediction = tf.equal(tf.round(tf.nn.sigmoid(pred)), tf.round(y_)) 
    

    Dann berechnen über alle Etiketten:

accuracy1 = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  • Genauigkeit in dem alle Etiketten müssen korrekt sein:
all_labels_true = tf.reduce_min(tf.cast(correct_prediction), tf.float32), 1) 
accuracy2 = tf.reduce_mean(all_labels_true) 
+0

Dank wirkt wie ein Zauber, verstehe ich das richtig, dass die reduce_min zusammen alle Etiketten eines Bildes Packs? – MaMiFreak

+0

Es wird das Minimum von correct_prediction für jedes Element des Stapels benötigt. Dieses Minimum ist 1, wenn alle Elemente 1 sind (dh alle Vorhersagen sind korrekt) und 0, wenn mindestens ein Element Falsch ist (und gleich 0) –

+0

Ich habe diesen Ansatz versucht, aber ich bekomme den gleichen Genauigkeitswert für jede Epoche: 'Train Genauigkeit: 0,984375 Testgenauigkeit: 0,984375'. Irgendeine Idee, warum das passiert? https://stackoverflow.com/questions/49210520/cant-get-correct-acccuracy-for-multi-label-prediction – Peterdk