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