import tensorflow as tf
array = tf.Variable(tf.random_normal([10]))
i = tf.constant(0)
l = []
def cond(i,l):
return i < 10
def body(i,l):
temp = tf.gather(array,i)
l.append(temp)
return i+1,l
index,list_vals = tf.while_loop(cond, body, [i,l])
我想以与上面代码中描述的方式类似的方式处理张量数组。在while循环的主体中,我想逐个元素地处理数组以应用一些函数。为了演示,我给了一个小代码片段。但是,它给出了如下错误消息。
ValueError: Number of inputs and outputs of body must match loop_vars: 1, 2
感谢您解决此问题的任何帮助。
由于
答案 0 :(得分:11)
引用文档:
的张量
loop_vars
是一个(可能是嵌套的)元组,名称元组或列表 传递给cond
和body
你不能将常规python数组作为张量传递。你能做的是:
i = tf.constant(0)
l = tf.Variable([])
def body(i, l):
temp = tf.gather(array,i)
l = tf.concat([l, [temp]], 0)
return i+1, l
index, list_vals = tf.while_loop(cond, body, [i, l],
shape_invariants=[i.get_shape(),
tf.TensorShape([None])])
形状不变量在那里,因为通常tf.while_loop
期望内部的张量形状,而循环不会改变。
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(list_vals)
Out: array([-0.38367489, -1.76104736, 0.26266089, -2.74720812, 1.48196387,
-0.23357525, -1.07429159, -1.79547787, -0.74316853, 0.15982138],
dtype=float32)
答案 1 :(得分:4)
TF提供了TensorArray来处理此类情况。在文档中,
类包装动态大小的,按时间划分的一次写入Tensor数组。
该类旨在与动态迭代原语(例如
while_loop
和map_fn
)一起使用。它通过特殊的“流”控制流依赖性支持梯度反向传播。
这里是一个例子,
import tensorflow as tf
array = tf.Variable(tf.random_normal([10]))
step = tf.constant(0)
output = tf.TensorArray(dtype=tf.float32, size=0, dynamic_size=True)
def cond(step, output):
return step < 10
def body(step, output):
output = output.write(step, tf.gather(array, step))
return step + 1, output
_, final_output = tf.while_loop(cond, body, loop_vars=[step, output])
final_output = final_output.stack()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(final_output))