Tensorflow:即使在关闭会话内存泄漏?Tensorflow:即使在关闭会话内存泄漏?(Ten

2019-05-12 05:42发布

我只是想一些东西了四元数的神经网络,当我意识到,即使我闭上当前会话中的for循环中,我的计划大规模减慢和我所造成的OPS内存泄漏正在建设中。 这是我的代码:

for step in xrange(0,200):#num_epochs * train_size // BATCH_SIZE):
338 
339         with tf.Session() as sess:
340 
341             offset = (BATCH_SIZE) % train_size
342             #print "Offset : %d" % offset
343 
344             batch_data = []
345             batch_labels = []
346             batch_data.append(qtrain[0][offset:(offset + BATCH_SIZE)])
347             batch_labels.append(qtrain_labels[0][offset:(offset + BATCH_SIZE)]
352             retour = sess.run(test, feed_dict={x: batch_data})
357 
358             test2 = feedForwardStep(retour, W_to_output,b_output)
367             #sess.close()

这个问题似乎来自test2 = feedForward(..) 我需要在执行后,这些OPS申报retour一次,因为retour不能是一个占位符(我需要来遍历它)。 如果没有这一行,程序运行得非常好,速度快,没​​有内存泄漏。 我不明白为什么看起来TensorFlow正试图“拯救” test2 ,即使我关闭会话...

Answer 1:

TL; DR:关闭会话不会释放tf.Graph在你的Python程序的数据结构,而如果每次循环添加节点图,你就会有泄漏。

由于你的函数feedForwardStep创造了新的TensorFlow操作,你把它内for循环,那么你的代码虽然是一个微妙的泄漏。

除非你指定(使用with tf.Graph().as_default():块),所有TensorFlow操作被添加到一个全局默认图形。 这意味着每次调用tf.constant() tf.matmul() tf.Variable()等增加对象的全局数据结构。 有两种方法来避免这种情况:

  1. 让你建立图表一次,然后利用结构程序tf.placeholder() OPS不同的值养活在每个迭代。 你提到你的问题,这也许是不可能的。

  2. 明确创建每个for循环新图。 如果图的结构取决于当前迭代的可用数据,这可能是必要的。 你会做到这一点,如下所示:

     for step in xrange(200): with tf.Graph().as_default(), tf.Session() as sess: # Remainder of loop body goes here. 

    请注意,在这个版本中,您不能使用TensorOperation从以前的迭代对象。 (例如,它不是从你的代码段,其中明确test得来的。)



文章来源: Tensorflow : Memory leak even while closing Session?