张量流中的典型训练循环可能如下:
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数组,我该怎么做?
答案 0 :(得分:2)
tf.Optimizer.compute_gradients()
方法不应该创建任何新的NumPy数组:而是构建一个TensorFlow操作图,用于计算模型中某些或所有变量的loss
渐变。返回值不是NumPy数组;它是一对渐变tf.Tensor
对象的列表,以及应该应用该渐变的相应tf.Variable
。
然而,在循环内调用opt.compute_gradients()
通常会浪费内存。很难说这是否会在没有看到更多代码的情况下完全正常工作,但您应该能够在循环之前将调用移至opt.compute_gradients()
,因为它似乎不依赖于内部计算的任何内容循环。这将避免在每次循环迭代中构建一个新的TensorFlow图段,并且应该降低内存成本。