tensorflow每次调用compute_gradients()时都会创建一个新的numpy数组吗?

时间:2017-04-24 07:15:33

标签: numpy tensorflow

张量流中的典型训练循环可能如下:

cg = opt.compute_gradients(loss)
grads = [None] * len(cg)
for gv in cg:
    grads[i] = gv[0]
# ... do some process to grads ...
apply_gradients = opt.apply_gradients(cg)
while (...):
    gradients = sess.run(grads)
    feed = dict()
    for i, grad_var in enumerate(cg)
        feed[grad_var[0]] = gradients[i]
    sess.run(apply_gradients, feed_dict=feed)

每次调用sess.run(grads)时,都会生成一个新的numpy数组gradients(带有新分配的内存)。我想在所有训练迭代中使用固定的numpy数组,我该怎么做?

1 个答案:

答案 0 :(得分:2)

tf.Optimizer.compute_gradients()方法不应该创建任何新的NumPy数组:而是构建一个TensorFlow操作图,用于计算模型中某些或所有变量的loss渐变。返回值不是NumPy数组;它是一对渐变tf.Tensor对象的列表,以及应该应用该渐变的相应tf.Variable

然而,在循环内调用opt.compute_gradients()通常会浪费内存。很难说这是否会在没有看到更多代码的情况下完全正常工作,但您应该能够在循环之前将调用移至opt.compute_gradients(),因为它似乎不依赖于内部计算的任何内容循环。这将避免在每次循环迭代中构建一个新的TensorFlow图段,并且应该降低内存成本。