后来如何在张量流中将累积的梯度应用于以numpy数组存储的张量流中?

时间:2018-07-31 02:01:08

标签: tensorflow backpropagation

我有一个模型,其中我通过多个示例手动计算了梯度。我手动添加了渐变,现在想通过张量流反向传播:

prev_accum_grads = [tf.placeholder_with_default(input=tf.zeros(shape=var.get_shape().as_list(), dtype=m_dtype),
                                                shape=var.get_shape().as_list(), name=var.name[:-2] + "_accum_grads") 
                   for var in tf.trainable_variables()]

grads_and_vars = list(zip(prev_accum_grads, tf.trainable_variables()))
train_step = optimizer.apply_gradients(grads_and_vars)

现在,给定prev_g[0], prev_g[1] ... prev_g[9]中计算出的梯度,如下代码所示;并希望将渐变应用为:

# prev_g is a numpy array holding the values of the gradients... AND NOT LIST of TENSORs
feed_dict = {
            prev_accum_grads[0]: prev_g[0], prev_accum_grads[1]: prev_g[1], prev_accum_grads[2]: prev_g[2],
            prev_accum_grads[3]: prev_g[3], prev_accum_grads[4]: prev_g[4], prev_accum_grads[5]: prev_g[5],
            prev_accum_grads[6]: prev_g[6], prev_accum_grads[7]: prev_g[7], prev_accum_grads[8]: prev_g[8],
            prev_accum_grads[9]: prev_g[9],
    }

_, train_summaries = sess.run([train_step, train_merged_summaries], 
                                  feed_dict=feed_dict)

所以此代码引发错误,要求我为input占位符提供值。

我尝试使用变量代替占位符,例如:

accum_vars = [tf.Variable(tf.zeros_like(tv), trainable=False) for tv in tf.trainable_variables()]

,然后为每个变量提供prev_g中的值;而且仍然引发相同的问题。我也尝试过:

grads_and_vars = list(zip([tf.convert_to_tensor(v) for v in accum_vars], tf.trainable_variables()))

但是我收到了同样的错误:

InvalidArgumentError: You must feed a value for placeholder tensor 'inputs_devel' with dtype double and shape....

我终于尝试了:

accum_vars = [tf.zeros_like(tv) for tv in tf.trainable_variables()]

因为tf.zeros_like返回张量。但这并没有效果。

那么如何解决这个问题?

我的最后一个问题:如果已经有了渐变,为什么需要输入?难道不能像梯度下降那样应用它们?

非常感谢您的帮助!

0 个答案:

没有答案