【发布时间】:2018-02-02 19:54:13
【问题描述】:
根据以下代码,m0 是一个形状为 (3,1) 的常数,但在 while 循环内改变了它的形状。 所以在 while 循环之后,Tensorflow 不知道它的形状,但我使用 set_shape 将其更改为正确的形状。 但是,当您通过优化(采用渐变)运行它时,它会弹出一个错误:
Incompatible shapes between op input and calculated input gradient. Forward operation: while_29/Enter_1. Input index: 0. Original input shape: (3, 1). Calculated input gradient shape: (15, 1)
似乎渐变仍然将形状视为 (3,1),但我们的 set_shape 将其更改为形状 (15,1)。谁能告诉我如何解决?
sess = tf.Session()
i0 = tf.constant(0)
m0 = tf.ones([3, 1])
x = tf.get_variable('www', shape=(3,1), initializer=tf.zeros_initializer)
loop = 5
def _cond(i0, m0):
return tf.less(i0, loop-1)
def _res(i0, m0):
n = tf.ones([3, 1]) + x
m0 = tf.concat([m0, n], axis=0)
return i0+1, m0
i0, m0 = tf.while_loop(
_cond, _res, loop_vars=[i0, m0],
shape_invariants=[i0.get_shape(), tf.TensorShape([None, 1])])
m0.set_shape([loop*3,1])
opt = tf.train.AdagradOptimizer(1)
grad = opt.compute_gradients(m0)
sess.run(tf.global_variables_initializer())
print(sess.run(grad))
【问题讨论】:
-
优化器在这里无关紧要。但是用 tf.gradients 替换“计算梯度”调用的 MWE 仍然会引发错误。无论如何,从您的问题中删除优化器以帮助隔离问题会更清楚
标签: tensorflow machine-learning deep-learning