如何在tensorflow中将张量列表作为输入传递给图形?

4
我正在使用形状为[None, None, 10]tf.placeholder()将输入传递给张量。现在,我想迭代输入的第一个维度,并对该维度中的每个切片应用一些函数。但是,当我尝试使用Python for循环执行此操作时,我会收到错误提示,指出Tensor对象不可迭代。

是否有任何方法可以将输入作为形状为[None, 10]的张量列表传递,并如何将此列表分配给占位符?或者是否有其他方法可以迭代Tensor的维度?


如果你想要使用Python的for循环并对每个结果应用一些Python函数,那么你需要先将结果实例化为numpy数组(使用会话运行)。 - Yaroslav Bulatov
2个回答

2

使用新的tf.map_fn(), tf.foldl(), tf.foldr()或(最常见的)tf.scan()高阶运算符可以实现这一点,这些运算符在TensorFlow 0.8版本中被添加。您要使用的特定运算符取决于您想执行的计算。例如,如果您想对张量的每一行执行相同的函数并将元素打包回单个张量,则会使用tf.map_fn()

p = tf.placeholder(tf.float32, shape=[None, None, 100])

def f(x):
    # x will be a tensor of shape [None, 100].
    return tf.reduce_sum(x)

# Compute the sum of each [None, 100]-sized row of `p`.
# N.B. You can do this directly using tf.reduce_sum(), but this is intended as 
# a simple example.
result = tf.map_fn(f, p)

这确实有点帮助,但仍然没有解决我的问题。我想要迭代列表的原因是我的第一行输出可能会影响到其他行,而不仅仅是下一行。我能在运行时将其转换为列表吗? - akshaybetala
你不能在运行时将其转换为列表。你可以尝试使用tf.foldl()tf.scan()来实现你想要做的事情,因为它们可以在迭代之间累积一些状态。 - mrry

0

您应该将输入作为形状为 [None, None, 10] 的单个张量 x 传递,并使用 tf.split(0, -1, x) 获取一个张量列表,以便进行迭代。


但这也会导致一个张量,对吧?那么我该如何迭代它? - akshaybetala
不是的,tf.split 返回一个列表而不是张量。 - Aaron
1
很不幸,由于tf.split()在图形构建时返回一个列表,因此num_split参数必须是大于零的整数,所以我认为这不会起作用。 - mrry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接