【问题标题】:How to optimize a variable with dynamic shape?如何优化具有动态形状的变量?
【发布时间】: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


【解决方案1】:

简短的回答是,您的问题可以通过像这样创建m0 来有效解决:

m0 = 1 + tf.tile( x, (loop,1) )

但是,您在上面遇到的根本问题的答案是您正在循环增长m0。但是,您知道您希望 m0 采用的大小,因此如果您确实必须使用 while_loop,那么您应该使用 TensorArray。像这样的:

def mystack(x, n):
    loop_vars = [
        tf.constant(0, tf.int32),
        tf.TensorArray(x.dtype, size=n),
    ]
    _, fx = tf.while_loop(
        lambda j, _: j < n,
        lambda j, result: (j + 1, result.write(j, 1+x)),
        loop_vars
    )
    return tf.reshape( fx.stack(), (-1,1) )

x = tf.constant( numpy.random.randn(3,1), tf.float32 )
loop = 5
m = mystack(x,loop)

with tf.Session() as sess:
    print(sess.run(m).shape)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 2019-02-08
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多