gpt4 book ai didi

tensorflow - 如何优化具有动态形状的变量?

转载 作者:行者123 更新时间:2023-11-30 09:18:36 25 4
gpt4 key购买 nike

根据以下代码,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))

最佳答案

简短的回答是,您的问题可以通过创建 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)

关于tensorflow - 如何优化具有动态形状的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com