2016-08-02 6 views
3

Я запускаю shadoworflow 0.10.0rc0 на OSX 10.9.5 Mavericks.Тензорный поток - утечка памяти?

Есть примерные примеры обучения в 25 000, 250 функций (x), 15 классов (y_), а предсказание (y) - это персептрон NN с одним скрытым слоем.

Следующий фрагмент простого цикла обучения, кажется, массивная утечка памяти (порядка 10 секунд ГЗА над = ~ 200 итераций - валит мой MBP :():

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() 

я делаю что-то очевидно, неправильно, или это на случай ошибки? Спасибо!

PS: Если это исправлено в более поздней сборке тензорного потока, обратите внимание, что для bazel требуется Yosemite или выше, поэтому я не могу создать свой собственный .whl-файл (AFAIK) из источника, есть ночной whl? Я бы предпочел не быть вынужденным в обновление ОС прямо сейчас.

+0

Edit: я добавил расчет точности испытаний; Я не уверен, как удалить это из цикла, так как y должен быть оценен после этапа обучения – jtlz2

ответ

3
  1. Не нужно его запускать sess.run(correct_prediction) - это переменная графика тензорного потока, от которой зависит переменная accuracy. Это означает, что он будет оцениваться во время вызова sess.run(accuracy) в любом случае.
  2. Возможно, вы изменили свой график, создав на каждой итерации новые переменные и accuracy. Это также не нужно - их можно перемещать за пределы цикла и просто оценивать каждый раз с помощью вызовов sess.run. Таким образом, ваш внутренний цикл будет что-то вроде
for i in range(niter): 
    # Train 
    _, c = sess.run([train_step, cost]) 
    print sess.run(accuracy) 
+0

Спасибо @Simon, который помогает в массовом порядке - использование ОЗУ намного более стабильно. Я подозреваю, что оставшаяся «утечка» исходит из второй оценки точности теста в цикле. Теперь исправить это .... – jtlz2

Смежные вопросы