我有以下几行作为计划的一部分:
./file%253Fformat%3Djson
我之所以这样做是因为我想使用numpy修改渐变。上面的代码在步骤800周围内存不足。但是,如果用tensor_gradients替换optimizer.apply_gradients步骤,则代码不会耗尽内存。
tensor_gradients = optimizer.compute_gradients(cross_entropy)
with tf.Session() as session:
for step in range(20000):
batch = mnist.train.next_batch(train_batch_size)
feed = {input_x: batch[0], input_y: batch[1]}
gradients = session.run([tensor_gradients], feed)[0]
for i in range(len(gradients)):
gradients[i] = (gradients[i][0], tensor_gradients[i][1])
... computation on gradients ...
training_step = optimizer.apply_gradients(gradients)
training = session.run([training_step], feed)
对可能发生的事情有任何想法?除上述行外,其余代码保持不变。是否有可能渐变中的numpy数组没有被垃圾收集,因为它们被传递到apply_gradients步骤?我不知道内存泄漏可能在哪里,或者我是否通过将修改过的渐变(以numpy数组形式)传递回apply_gradients而无意中添加到张量流图中。
答案 0 :(得分:1)
关于可能发生的事情的任何想法?
OOM的发生是因为你在循环中构建了图形:这构建了一个包含20,000x节点的图形,运行它可能需要比你更多的内存。
将构建图形的所有TF操作移出循环,即除feed_dict
构造和sess.run
调用之外的所有内容。
回复评论
应用渐变构建图形?
是的,如果您查看文档:
Returns:
An `Operation` that applies the specified gradients. If `global_step`
was not None, that operation also increments `global_step`.