2015-11-20 12 views
21

Sto osservando il tutorial "MNIST For ML Beginners" di TensorFlow e voglio stampare la perdita dell'allenamento dopo ogni passaggio di addestramento.Stampa della perdita durante l'allenamento TensorFlow

Il mio ciclo di formazione attualmente si presenta così:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

Ora, train_step è definito come:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

Dove cross_entropy è la perdita che voglio stampare:

cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 

Un modo per stampare questo sarebbe calcolare esplicitamente cross_entropy nel ciclo di formazione:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    print 'loss = ' + str(cross_entropy) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

Ora ho due domande per quanto riguarda questo:

  1. Dato che cross_entropy è già calcolato durante sess.run(train_step, ...), sembra inefficiente per calcolare due volte, che richiede il doppio del numero di inoltra i passaggi di tutti i dati di allenamento. C'è un modo per accedere al valore di cross_entropy quando è stato calcolato durante il sess.run(train_step, ...)?

  2. Come si stampa addirittura un tf.Variable? Usando str(cross_entropy) mi dà un errore ...

Grazie!

risposta

32

È possibile recuperare il valore di cross_entropy aggiungendolo all'elenco di argomenti a sess.run(...). Ad esempio, il for -loop potrebbe essere riscritto come segue:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val = sess.run([train_step, cross_entropy], 
          feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = ' + loss_val 

Lo stesso approccio può essere utilizzato per stampare il valore corrente di una variabile. Diciamo che, oltre al valore della cross_entropy, si voleva stampare il valore di un tf.Variable chiamato W, si potrebbe procedere come segue:

for i in range(100): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 
    _, loss_val, W_val = sess.run([train_step, cross_entropy, W], 
            feed_dict={x: batch_xs, y_: batch_ys}) 
    print 'loss = %s' % loss_val 
    print 'W = %s' % W_val 
+3

Grazie. Quindi ogni volta che chiamo 'sess.run ([train_step, cross_entropy])', calcola ancora 'cross_entropy' una sola volta, giusto? Non fa un ulteriore passaggio in avanti per ciascuna delle variabili che passo? – Karnivaurus

+2

Esatto - esegue esattamente lo stesso sottografo (poiché "cross_entropy' è già calcolato come parte della fase di addestramento), e aggiunge semplicemente un nodo aggiuntivo per recuperare il valore di" cross_entropy' indietro nel programma Python. – mrry

+0

Grazie.Come punto a parte, dopo aver aggiornato il mio codice come suggerito, il valore di 'cross_entropy' diminuisce, in media, sul loop. Tuttavia, a volte in realtà aumenta da una iterazione di allenamento alla successiva. Questo accade per un intervallo di dimensioni dei gradini nella discesa del gradiente. È previsto? La perdita non diminuirà sempre dopo ogni iterazione, perché stai spostando i pesi in una direzione che dovrebbe ridurre questa perdita? Il grafico della perdita vs iterazione è qui: http://i.stack.imgur.com/f8B80.png – Karnivaurus

3

Invece di eseguire solo training_step, eseguire anche il nodo cross_entropy in modo che venga restituito il valore. Ricordate che:

var_as_a_python_value = sess.run(tensorflow_variable) 

vi darà quello che vuoi, in modo da poter fare questo:

[_, cross_entropy_py] = sess.run([train_step, cross_entropy], 
           feed_dict={x: batch_xs, y_: batch_ys}) 

sia per eseguire il training ed estrarre il valore dell'entropia croce come è stato calcolato durante la iterazione. Nota che ho trasformato entrambi gli argomenti in sess.run e i valori di ritorno in una lista in modo che entrambi accadano.

Problemi correlati