2016-05-26 6 views
2

Ich trainiere ein Standard, einfache Multilayer-Perzeptron ANN mit drei versteckten Schichten in TensorFlow. Ich fügte einen Textfortschrittsbalken hinzu, so dass ich den Fortschritt der Iteration durch die Epochen beobachten konnte. Was ich finde, ist, dass die Verarbeitungszeit pro Iteration nach den ersten paar Epochen zunimmt. Hier ist ein Beispiel-Screenshot die Zunahme bei jeder Iteration zeigt:TensorFlow: Jede Iteration im Training for-loop langsamer

Execution time per iteration increases with # of iterations

In diesem Fall werden die ersten paar Iterationen dauerte etwa 1.05s/es und um 100% wurde 4.01s/mitnimmt.

Der entsprechende Code ist hier aufgelistet:

# ------------------------- Build the TensorFlow Graph ------------------------- 

with tf.Graph().as_default(): 

    (a bunch of statements for specifying the graph) 

# --------------------------------- Training ---------------------------------- 

    sess = tf.InteractiveSession() 
    sess.run(tf.initialize_all_variables()) 

    print "Start Training" 

    pbar = tqdm(total = training_epochs) 
    for epoch in range(training_epochs): 
     avg_cost = 0.0 
    batch_iter = 0 

    while batch_iter < batch_size: 
     train_features = [] 
     train_labels = [] 
     batch_segments = random.sample(train_segments, 20) 
     for segment in batch_segments: 
      train_features.append(segment[0]) 
      train_labels.append(segment[1]) 
     sess.run(optimizer, feed_dict={x: train_features, y_: train_labels}) 
     line_out = "," + str(batch_iter) + "\n" 
     train_outfile.write(line_out) 
     line_out = ",," + str(sess.run(tf.reduce_mean(weights['h1']), feed_dict={x: train_features, y_: train_labels})) 
     line_out += "," + str(sess.run(tf.reduce_mean(weights['h2']), feed_dict={x: train_features, y_: train_labels})) 
     line_out += "," + str(sess.run(tf.reduce_mean(weights['h3']), feed_dict={x: train_features, y_: train_labels})) + "\n" 
     train_outfile.write(line_out) 
     avg_cost += sess.run(cost, feed_dict={x: train_features, y_: train_labels})/batch_size 

     batch_iter += 1 

    pbar.update(1) # Increment the progress bar by one 

train_outfile.close() 
print "Completed training" 

In Stackoverflow Suche, fand ich Processing time gets longer and longer after each iteration wo jemand anderes war auch Probleme mit jeder Iteration, die länger als die letzte ist. Aber ich glaube, mein verschieden sein können, da sie eindeutig ops wurden dem Diagramm Hinzufügen-Anweisungen wie folgt:

distorted_image = tf.image.random_flip_left_right(image_tensor) 

Während ich TensorFlow bin neu, ich glaube nicht, dass ich den gleichen Fehler mache weil die einzigen Sachen in meiner Schleife sess.run() sind.

Jede Hilfe wird sehr geschätzt.

+4

Hinzufügen in den Körper der Schleife mit session.run Aufruf erzwingt Serialisierung/Kopieren des gesamten Graphen, so dass diese Art von Schleife quadratische Komplexität hat. Sie können tun 'self.tf.get_default_graph(). Finalize()', damit Sie keine versehentlichen Änderungen von Graphen wie dieser haben –

+0

@ YaroslavBulatov, vielen Dank für die mich auf die finalize() -Funktion. Ich wusste nichts davon. Ich konnte ein paar andere Stellen finden, an denen ich versehentlich Graphen hinzufügte. – DojoGojira

+0

@etarion, habe ich ausdrücklich auf den anderen Thread verwiesen (es war der Hyperlink für "diesen Beitrag") und fühlte, dass mein anderer war. Ich werde meine Frage bearbeiten, um das klarzustellen. – DojoGojira

Antwort

7

Die drei Orte, an denen Sie haben:

sess.run(tf.reduce_mean(weights['h1']), ...) 

jeder anhängen einen neuen tf.reduce_mean() Knoten auf dem Graphen bei jeder Iteration der while-Schleife, die Overhead hinzufügt. Versuchen Sie, sie außerhalb der While-Schleife zu erstellen:

+2

Was Yaroslav oben sagt, ist auch in diesem Fall richtig. –

+0

Ja, ich wusste nichts über die Funktion finalize(). Ihre Antwort war sehr hilfreich, also habe ich Ihnen das Häkchen gegeben, aber ich habe am Ende seine Antwort verwendet, um ein paar andere Stellen zu finden, an denen ich versehentlich Grafiken hinzugefügt habe. Danke für deine sehr klare Antwort. – DojoGojira

Verwandte Themen