2016-03-29 19 views
33

Sto provando a eseguire una rete neurale più volte con parametri diversi per calibrare i parametri di rete (probabilità di abbandono, tasso di apprendimento e.d.). Tuttavia sto avendo il problema che il funzionamento della rete, mantenendo i parametri lo stesso ancora mi dà una soluzione diversa quando si esegue la rete in un ciclo come segue:Come ottenere risultati stabili con TensorFlow, impostazione di seed random

filename = create_results_file() 
for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 
    f, w = get_csv_writer(filename) 
    w.writerow([accuracy_result, "did run %d" % i, average_error]) 
    f.close() 

Sto usando il seguente codice all'inizio del la mia funzione train_network prima di impostare gli strati e funzione di errore della mia rete:

np.random.seed(1) 
tf.set_random_seed(1) 

ho anche provato ad aggiungere questo codice prima della creazione del grafico tensorflow, ma io continuo a ricevere diverse soluzioni nella mia uscita risultati.

Sto utilizzando un AdamOptimizer e sto inizializzando i pesi di rete utilizzando tf.truncated_normal. Inoltre sto usando np.random.permutation per mescolare le immagini in arrivo per ogni epoca.

risposta

24

L'impostazione del seme casuale TensorFlow corrente influisce solo sul grafico predefinito corrente. Poiché stai creando un nuovo grafico per il tuo allenamento e lo imposti come predefinito (with g.as_default():), devi impostare il seme casuale nell'ambito di quel blocco with.

Ad esempio, il ciclo dovrebbe essere simile al seguente:

for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    tf.set_random_seed(1) 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 

Si noti che questa utilizzerà lo stesso seme casuale per ogni iterazione del ciclo esterno for. Se si desidera utilizzare un diverso — ma ancora deterministico — sementi in ogni iterazione, è possibile utilizzare tf.set_random_seed(i + 1).

+2

ritengo mio set_random_seed (1) era già all'interno del blocco che g.as_default() in quanto è una delle prime linee entro il codice treno_network. Ciò nonostante ho provato a mettere il codice come nel tuo esempio, ma sto ancora ottenendo risultati instabili: > precisione \t etichette \t errore > 0,9805 \t ha run0 \t 2,96,916 mila > 0,9807 \t fatto run1 \t 2,96,494 mila > 0,9804 \t fatto run2 \t 2.95215 – Waanders

+0

Ho lo stesso problema. 'tensorflow'' 0.12.1' settando seed random come specificato, vedo leggere differenze nelle uscite di probabilità da run a run. – Luke

+2

La ragione dipenderà da quale sia la tua funzione, ma è probabile che piccole differenze nel calcolo dell'accuratezza siano causate da una riduzione parallela non deterministica di operazioni come "tf.reduce_sum()". (Queste operazioni trattano l'addizione in virgola mobile come commutativa, quando in realtà non lo è, e le modifiche nell'ordine di riduzione possono portare a lievi errori nel risultato ....) – mrry

6

Il comportamento deterministico può essere ottenuto fornendo un seme a livello di grafico o di livello operativo. Entrambi hanno funzionato per me. Un seme di livello grafico può essere posizionato con tf.set_random_seed. Un seme-livello operativo può essere disposto ad esempio, in un intializer variabile come in:

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0)) 
Problemi correlati