2015-12-26 26 views
23

Sto cercando di imparare come usare tensorflow e tensorboard. Ho un progetto di test basato sul tutorial sulla rete neurale MNIST (https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html).Formazione di registrazione e perdita di validazione in tensore

Nel mio codice, costruisco un nodo che calcola la frazione di cifre in un insieme di dati che sono correttamente classificate, in questo modo:

correct = tf.nn.in_top_k(self._logits, labels, 1) 
correct = tf.to_float(correct) 
accuracy = tf.reduce_mean(correct) 

Qui, self._logits è la parte inferenza del grafico, e labels è un segnaposto che contiene le etichette corrette.

Ora, ciò che vorrei fare è valutare la precisione sia del set di allenamento che del set di validazione come proventi della formazione. Posso farlo eseguendo il nodo di precisione due volte, con diversi feed_dicts:

train_acc = tf.run(accuracy, feed_dict={images : training_set.images, labels : training_set.labels}) 
valid_acc = tf.run(accuracy, feed_dict={images : validation_set.images, labels : validation_set.labels}) 

Questo funziona come previsto. Posso stampare i valori e posso vedere che inizialmente le due precisioni aumenteranno entrambe, e alla fine la precisione della validazione si appiattirà mentre la precisione dell'allenamento continua ad aumentare.

Tuttavia, vorrei anche ottenere grafici di questi valori in tensorboard e non riesco a capire come farlo. Se aggiungo semplicemente uno scalar_summary a accuracy, i valori registrati non distinguono tra set di allenamento e set di convalida.

Ho anche provato a creare due nodi identici accuracy con nomi diversi e uno in esecuzione sul set di formazione e uno sul set di convalida. Quindi aggiungo uno scalar_summary a ciascuno di questi nodi. Questo mi dà due grafici in tensorboard, ma invece di un grafico che mostra la precisione dell'insieme di allenamento e uno che mostra la precisione dell'insieme di validazione, entrambi mostrano valori identici che non corrispondono a quelli stampati sul terminale.

Probabilmente fraintendo come risolvere questo problema. Qual è il modo consigliato di registrare separatamente l'output da un singolo nodo per diversi input?

risposta

39

Ci sono diversi modi per ottenere questo risultato, ma siete sulla strada giusta con la creazione di diversi nodi tf.summary.scalar(). Dal momento che è necessario chiamare in modo esplicito SummaryWriter.add_summary() ogni volta che si desidera accedere un quantitativo al file evento, l'approccio più semplice è probabilmente per andare a prendere il nodo sintesi appropriata ogni volta che si desidera ottenere la formazione o la convalida precisione:

accuracy = tf.reduce_mean(correct) 

training_summary = tf.summary.scalar("training_accuracy", accuracy) 
validation_summary = tf.summary.scalar("validation_accuracy", accuracy) 


summary_writer = tf.summary.FileWriter(...) 

for step in xrange(NUM_STEPS): 

    # Perform a training step.... 

    if step % LOG_PERIOD == 0: 

    # To log training accuracy. 
    train_acc, train_summ = sess.run(
     [accuracy, training_summary], 
     feed_dict={images : training_set.images, labels : training_set.labels}) 
    writer.add_summary(train_summ, step) 

    # To log validation accuracy. 
    valid_acc, valid_summ = sess.run(
     [accuracy, validation_summary], 
     feed_dict={images : validation_set.images, labels : validation_set.labels}) 
    writer.add_summary(valid_summ, step) 

alternativa , è possibile creare un singolo op di riepilogo il cui tag è un tf.placeholder(tf.string, []) e alimentare la stringa "training_accuracy" o "validation_accuracy" come appropriato.

+4

Grazie! Questo era esattamente quello che stavo cercando! Il mio problema era che stavo cercando di usare una singola chiamata a "merge_all_summaries" piuttosto che fare "add_summary" per ogni riepilogo. La documentazione sembra suggerire che l'uso di 'merge_all_summaries' è preferito rispetto alle singole chiamate a' add_summary', ma in questo caso il modo manuale sembra migliore. – user3468216

+4

Ciò è corretto: 'merge_all_summaries' è un modo" one size fits all "per fare le cose, ma le singole chiamate a' add_summary' ti danno molto più controllo. (Per quel che vale, di solito impostiamo processi separati per fare training e validazione, dove l'attività di validazione ha il suo grafico - leggermente diverso - e carica periodicamente nell'ultimo checkpoint del modello.) – mrry

+0

@mrry Esiste un tutorial su come eseguire la convalida mentre si fa riferimento ai checkpoint di addestramento? – piRSquared

1

Un altro modo per farlo è utilizzare un secondo writer di file. Quindi sei in grado di usare il comando merge_summaries.

train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train', sess.graph) test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test') tf.global_variables_initializer().run()

Ecco la documentazione completa. Questo funziona per me bene: https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard

Problemi correlati