2016-06-10 14 views
13

Sto lavorando su un problema multi etichetta e sto cercando di determinare la precisione del mio modello.Tensorflow, calcolo dell'accuratezza multi etichetta

Il mio modello:

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) 

voglio calcolare la precisione in due modi diversi
-% di tutte le etichette che si prevede correttamente -% di immagini in cui tutte le etichette sono previsti correttamente

sfortunatamente sono in grado di calcolare solo la% di tutte le etichette previste correttamente.

Ho pensato che questo codice dovrebbe calcolare% di immagini in cui tutte le etichette sono previsti correttamente

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

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

e questo codice% di tutte le etichette che vengono predetto correttamente

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

in qualche modo la coerenza delle etichette appartenenza a una immagine è persa e non sono sicuro del perché.

risposta

18

Credo che il bug nel codice sia in: correct_prediction = tf.equal(tf.round(pred), tf.round(y_)).

pred deve essere log. Non scalati (vale a dire senza un sigmoide finale).

Qui si desidera confrontare l'output di sigmoid(pred) e y_ (sia nell'intervallo [0, 1]) quindi si deve scrivere:

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

Poi per calcolare:

  • accuratezza media su tutte le etichette:
accuracy1 = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  • Precisione in cui tutte le etichette devono essere corrette:
all_labels_true = tf.reduce_min(tf.cast(correct_prediction), tf.float32), 1) 
accuracy2 = tf.reduce_mean(all_labels_true) 
+0

Grazie funziona come un fascino, non ho capito bene che il reduce_min racchiude tutte le etichette di una sola immagine insieme? – MaMiFreak

+0

Ci vorrà il minimo di corrette_prediction per ogni elemento del batch. Questo minimo è 1 se tutti gli elementi sono 1 (ovvero tutte le previsioni sono corrette) e 0 se almeno un elemento è False (e uguale a 0) –

+0

Ho provato questo approccio, ma ottengo lo stesso valore di accuratezza per ogni epoca: 'Train precisione: 0.984375 Precisione del test: 0.984375'. Qualche idea del perché accada questo? https://stackoverflow.com/questions/49210520/cant-get-correct-acccuracy-for-multi-label-prediction – Peterdk

Problemi correlati