2016-08-02 10 views
3

Ich lief Tensorflow 0.10.0rc0 auf OSX 10.9.5 Mavericks.tensorflow - Speicherleck?

Es gibt ungefähr 25k Trainingsbeispiele, 250 Merkmale (x), 15 Klassen (y_) und die Vorhersage (y) ist ein NN-Perzeptron mit einer einzigen versteckten Schicht.

folgender Ausschnitt aus einer einfachen Trainingsschleife scheint einen massiven Speicherverlust zu haben (der Ordnung 10s von GBs über = ~ 200 Iterationen - bringt meinen MBP unten :():

import tensorflow as tf 

# Initialize placeholders and variables etc... 
... 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y,y_)) 
train_step = tf.train.GradientDescentOptimizer(lrate).minimize(cost)  

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

for i in range(niter): 
    # Train 
    _,c=sess.run([train_step,cost]) 
    correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) 
    sess.run(correct_prediction) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) 
    print sess.run(accuracy) 

    # EDIT: Calculate test error 
    ytest=sess.run(y[itrain:itrain+itest,:]) 
    ytest_=sess.run(y_[itrain:itrain+itest,:]) 
    test_prediction = tf.equal(tf.argmax(ytest,1), tf.argmax(ytest_,1)) 
    test_accuracy=tf.reduce_mean(tf.cast(test_prediction,tf.float32)) 
    print sess.run(test_accuracy) 

sess.close() 

Bin ich etwas zu tun offensichtlich falsch, oder ist das pro Chance ein Fehler? Danke!

PS: Wenn dies in einem späteren Tensorflow Build behoben wird, beachten Sie, dass Bazel Yosemite oder höher erfordert, so kann ich meine eigene .whl-Datei (AFAIK) aus Quelle, ist eine nächtliche whl verfügbar? Ich würde lieber nicht in ein Betriebssystem-Upgrade sofort gezwungen werden.

+0

Edit: ich die Testgenauigkeit Berechnung hinzugefügt; Ich bin nicht sicher, wie man das aus der Schleife entfernt, da y nach dem Trainingsschritt – jtlz2

Antwort

3
  1. Es ist nicht notwendig, sess.run(correct_prediction) auszuführen - es ist eine Tensorflow-Grafikvariable, von der die accuracy-Variable abhängig ist. Dies bedeutet, dass es in jedem Fall während des Anrufs zu sess.run(accuracy) ausgewertet wird.
  2. Sie ändern wahrscheinlich Ihr Diagramm, indem Sie bei jeder Iteration neue Variablen correct_prediction und accuracy erstellen. Dies ist auch nicht notwendig - sie können außerhalb der Schleife verschoben und einfach jedes Mal mit Aufrufen von sess.run ausgewertet werden. So Ihre innere Schleife wird etwas sein, wie
for i in range(niter): 
    # Train 
    _, c = sess.run([train_step, cost]) 
    print sess.run(accuracy) 
+0

ausgewertet werden muss Dank @Simon, das massiv hilft - die RAM-Nutzung ist viel stabiler. Ich vermute, dass das verbleibende "Leck" von einer zweiten Testsatz-Genauigkeitsbewertung innerhalb der Schleife herrührt. Jetzt um es zu reparieren .... – jtlz2