可变大小张量

时间:2017-01-17 17:56:03

标签: tensorflow

在Tensorflow中,递归应用一组操作的最简单方法是什么,其中每个递归步骤将最后一步的输出作为输入?这里的关键特性是递归步骤的数量在评估时指定,并且可以在不同的示例之间变化。

例如,对于输入张量X5和某些函数F,我想计算

F( F( F( F( F(X) ) ) ) )

但同一模型也应该能够将X3计算为:

F( F( F( X ) ) )

不幸的是,while循环不起作用,因为它们强制执行严格的形状不变量,这意味着在编译时必须知道张量X的所有维度,但我不知道示例大小(X的第一个维度)直到运行时

感谢您的帮助!

1 个答案:

答案 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]