当我意识到,即使我在 for 循环中关闭当前会话,我的程序也会大幅减慢,并且由于正在构建的操作而导致内存泄漏,我只是在尝试四元神经网络的一些东西。这是我的代码:
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:关闭会话并不会释放tf.Graph https://www.tensorflow.org/versions/r0.7/api_docs/python/framework.html#GraphPython 程序中的数据结构,如果循环的每次迭代都会向图中添加节点,则会出现泄漏。
由于你的功能feedForwardStep
创建新的 TensorFlow 操作,并在for
循环,然后有is代码中的泄漏——尽管很微妙。
除非您另外指定(使用with tf.Graph().as_default(): https://www.tensorflow.org/versions/r0.7/api_docs/python/framework.html#Graph.as_default块),所有 TensorFlow 操作都添加到全局默认图。这意味着每次调用tf.constant()
, tf.matmul()
, tf.Variable()
等将对象添加到全局数据结构中。有两种方法可以避免这种情况:
构建你的程序,以便你构建一次图表,然后使用tf.placeholder() https://www.tensorflow.org/versions/r0.7/api_docs/python/io_ops.html#placeholder在每次迭代中输入不同值的操作。您在问题中提到这可能是不可能的。
-
在每个 for 循环中显式创建一个新图。如果图的结构取决于当前迭代中可用的数据,则这可能是必要的。您可以按如下方式执行此操作:
for step in xrange(200):
with tf.Graph().as_default(), tf.Session() as sess:
# Remainder of loop body goes here.
请注意,在此版本中,您不能使用Tensor
or Operation
来自上一次迭代的对象。 (例如,从您的代码片段中不清楚test
来自。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)