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

时间:2016-02-29 08:47:23

标签: memory-management memory-leaks neural-network tensorflow

当我意识到,即使我在for循环中关闭当前的Session,我的程序也会大幅减速并且由于构造操作而导致内存泄漏,我只是尝试了一些四元数神经网络的东西。这是我的代码:

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(..)。我需要在执行retour一次之后声明这些操作,因为retour不能成为占位符(我需要遍历它)。没有这一行,程序运行得非常好,速度快,没​​有内存泄漏。我无法理解为什么TensorFlow似乎试图“保存”#34; test2即使我关闭会话......

1 个答案:

答案 0 :(得分:10)

TL; DR:关闭会话不会释放Python程序中的tf.Graph数据结构,如果循环的每次迭代都将节点添加到图形中,您将拥有泄漏。

由于您的函数feedForwardStep创建了新的TensorFlow操作,并且您在for循环中调用它,因此 代码中的泄漏 - 尽管是一个微妙的漏洞。

除非您另行指定(使用with tf.Graph().as_default():块),否则所有TensorFlow操作都将添加到全局默认图形中。这意味着每次调用tf.constant()tf.matmul()tf.Variable()等都会将对象添加到全局数据结构中。有两种方法可以避免这种情况:

  1. 构建程序,以便您构建一次图表,然后使用tf.placeholder()操作在每次迭代中输入不同的值。你在问题中提到这可能是不可能的。

  2. 在每个for循环中显式创建一个新图形。如果图的结构取决于当前迭代中可用的数据,则可能需要这样做。你可以这样做:

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

    请注意,在此版本中,您无法使用上一次迭代中的TensorOperation个对象。 (例如,您的代码段中不清楚test来自何处。)