Tensorflow compute_gradients和apply_gradients内存不足

时间:2017-05-17 22:17:06

标签: python numpy tensorflow

我有以下几行作为计划的一部分:

./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而无意中添加到张量流图中。

1 个答案:

答案 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`.