Memory management Tensorflow:关闭会话时内存泄漏?

Memory management Tensorflow:关闭会话时内存泄漏?,memory-management,memory-leaks,neural-network,tensorflow,Memory Management,Memory Leaks,Neural Network,Tensorflow,当我意识到,即使我在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

当我意识到,即使我在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(..)
。我需要在执行
retour
一次之后声明这些操作,因为
retour
不能是占位符(我需要遍历它)。没有这一行,程序运行得很好,速度很快,并且没有内存泄漏。我不明白为什么TensorFlow似乎在试图“保存”
test2
,即使我关闭了会话

TL;DR:关闭会话不会释放Python程序中的数据结构,如果循环的每次迭代都向图中添加节点,则会出现泄漏

由于您的函数
feedForwardStep
创建了新的TensorFlow操作,并且您在
for
循环中调用了它,因此您的代码中存在漏洞,尽管漏洞很小

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

  • 构造您的程序,以便只构建一次图形,然后使用ops在每次迭代中输入不同的值。你在问题中提到这可能是不可能的

  • 在每个for循环中显式创建一个新图形。如果图的结构取决于当前迭代中可用的数据,那么这可能是必要的。您可以按如下方式执行此操作:

    for step in xrange(200):
        with tf.Graph().as_default(), tf.Session() as sess:
            # Remainder of loop body goes here.
    
    请注意,在此版本中,不能使用上一次迭代中的
    张量
    操作
    对象。(例如,您的代码片段不清楚
    test
    来自何处。)


  • 谢谢我将尝试你的第二个命题,test是一个我可以在for循环之外定义的op(正如你在1点中建议的那样)。不幸的是,我得到了一个很好的答案:“会话图是空的。在调用run()之前向图中添加操作。”使用tf.graph.as_default()此解决方案不适用于tensorflow 1.4,另请参阅此错误报告: