Tit*_*let 7 memory-leaks memory-management 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()
Run Code Online (Sandbox Code Playgroud)
问题似乎来自test2 = feedForward(..).我需要在执行retour一次后声明这些操作,因为retour不能是占位符(我需要遍历它).没有这一行,程序运行得非常好,速度快,没有内存泄漏.我无法理解为什么TensorFlow似乎试图"保存" test2即使我关闭会话......
mrr*_*rry 12
TL; DR:关闭会话不会释放tf.GraphPython程序中的数据结构,如果循环的每次迭代都将节点添加到图形中,那么您将会发生泄漏.
由于你的函数feedForwardStep创建新TensorFlow操作,你把它的内for循环,再有就是在你的代码虽然是一个微妙的泄漏.
除非您另行指定(使用with tf.Graph().as_default():块),否则所有TensorFlow操作都将添加到全局默认图形中.这意味着每次调用tf.constant(),tf.matmul(),tf.Variable()等添加对象的全局数据结构.有两种方法可以避免这种情况:
构建程序以便构建一次图形,然后使用tf.placeholder()ops在每次迭代中输入不同的值.你在问题中提到这可能是不可能的.
在每个for循环中显式创建一个新图.如果图的结构取决于当前迭代中可用的数据,则可能需要这样做.您可以这样做:
for step in xrange(200):
with tf.Graph().as_default(), tf.Session() as sess:
# Remainder of loop body goes here.
Run Code Online (Sandbox Code Playgroud)
请注意,在此版本中,您不能使用上一次迭代中的对象Tensor或Operation对象.(例如,从您的代码片段中发现它不清楚test.)
| 归档时间: |
|
| 查看次数: |
5221 次 |
| 最近记录: |