Python Tensorflow';在非常简单的“;对于循环”;
我有一个关于tensorflow的非常奇怪的问题。我将问题简化为以下版本: 我问这个问题是因为我需要运行一系列的训练,我只是把它们放在一个for循环中,然后为每个迭代使用不同的参数 为了简化这个问题,我用tensorflow语言写了一个简单的矩阵乘法,然后我把这个“矩阵乘法训练”放在一个“for循环”中(当然你可以把其他复杂的函数放在for循环中,结论是一样的) 我设置了100000次迭代,这意味着我将运行10000个训练示例。打印每个循环中的时间消耗,然后我可以观察到每个迭代的时间消耗是相同的,这没有问题。但是内存成本增长非常快,最后我得到了一个错误:“内存不足”(我希望每次迭代内存应该保持不变)Python Tensorflow';在非常简单的“;对于循环”;,python,tensorflow,Python,Tensorflow,我有一个关于tensorflow的非常奇怪的问题。我将问题简化为以下版本: 我问这个问题是因为我需要运行一系列的训练,我只是把它们放在一个for循环中,然后为每个迭代使用不同的参数 为了简化这个问题,我用tensorflow语言写了一个简单的矩阵乘法,然后我把这个“矩阵乘法训练”放在一个“for循环”中(当然你可以把其他复杂的函数放在for循环中,结论是一样的) 我设置了100000次迭代,这意味着我将运行10000个训练示例。打印每个循环中的时间消耗,然后我可以观察到每个迭代的时间消耗是相同的
我知道原因是,在每次迭代中,程序创建了一个新的操作,这将增加内存。我想知道有没有办法在每次迭代后释放内存开销?(此内存问题与GPU情况相同)您的代码的结构应如下所示:
import tensorflow as tf
import numpy as np
A = tf.placeholder(tf.float32, [1,100])
B = tf.placeholder(tf.float32, [100,100])
result = tf.matmul(A,B)
init_op = tf.global_variables_initializer()
# Later, when launching the model
with tf.Session() as sess:
# Run the init operation.
# This will make sure that memory is only allocated for the variable once.
sess.run(init_op)
for i in range(100000):
a = np.arange(100).reshape(1,-1)
b = np.arange(10000).reshape(100,100)
sess.run(result, feed_dict={A: a, B: b})
if i % 1000 == 0:
print(i, "processed")
在这里,您将为第一次迭代分配一次内存,并在后续迭代中继续重用相同的内存块。try
import-gc;gc.collect()
在大约每100次迭代之后。这不是问题。你解决你的需求是错误的。您应该做的是创建一个图,并以迭代方式将数据提供给它。您正在为每个迭代创建新的tf图。这会导致您的内存很快用完。我建议你重新构造你的代码。这不起作用,内存仍然在增加。这个问题有张量流方法吗?我知道你的意思。我只是将我的代码简化成这个版本,我必须将训练放入for循环,这意味着我必须运行多个训练,我的情况必须这样做(出于某些特殊原因)。这就是为什么我必须释放内存,tensorflow不是那样工作的。我知道你有特殊情况。尝试并找到一种方法,如何将您的特殊情况转化为标准。试着从更广阔的角度看待这个问题。弄清楚你如何使用这项技术并解决问题。好的,明白了。非常感谢,我将尝试修改代码。
import tensorflow as tf
import numpy as np
A = tf.placeholder(tf.float32, [1,100])
B = tf.placeholder(tf.float32, [100,100])
result = tf.matmul(A,B)
init_op = tf.global_variables_initializer()
# Later, when launching the model
with tf.Session() as sess:
# Run the init operation.
# This will make sure that memory is only allocated for the variable once.
sess.run(init_op)
for i in range(100000):
a = np.arange(100).reshape(1,-1)
b = np.arange(10000).reshape(100,100)
sess.run(result, feed_dict={A: a, B: b})
if i % 1000 == 0:
print(i, "processed")