在Tensorflow中,递归应用一组操作的最简单方法是什么,其中每个递归步骤将最后一步的输出作为输入?这里的关键特性是递归步骤的数量在评估时指定,并且可以在不同的示例之间变化。
例如,对于输入张量X
,5
和某些函数F
,我想计算
F( F( F( F( F(X) ) ) ) )
但同一模型也应该能够将X
,3
计算为:
F( F( F( X ) ) )
不幸的是,while循环不起作用,因为它们强制执行严格的形状不变量,这意味着在编译时必须知道张量X的所有维度,但我不知道示例大小(X的第一个维度)直到运行时
感谢您的帮助!
答案 0 :(得分:2)
使用while循环,即tf.while_loop
构造,可以在TensorFlow中轻松实现所需。 tf.while_loop
有一个shape_invariants
参数,可让您为每个循环变量指定一个(可能是部分的)形状。该形状只需要比循环变量在循环期间可以采用的形状更不具体。以下是F
将值附加到张量的完整示例。
import tensorflow as tf
sess = tf.InteractiveSession()
i = tf.constant(0, dtype=tf.int32)
x = tf.constant(0, shape=[0], dtype=tf.int32)
i, x = tf.while_loop(lambda i, _: i < 10,
lambda i, x: (i + 1, tf.concat_v2([x, tf.expand_dims(i, 0)], 0)),
[i, x],
shape_variants=[i.get_shape(), tf.TensorShape([None])])
print(x.eval())
[0 1 2 3 4 5 6 7 8 9]