我有一个模型,其中我通过多个示例手动计算了梯度。我手动添加了渐变,现在想通过张量流反向传播:
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
返回张量。但这并没有效果。
那么如何解决这个问题?
我的最后一个问题:如果已经有了渐变,为什么需要输入?难道不能像梯度下降那样应用它们?
非常感谢您的帮助!