我可以在张量流控制循环中改变python列表吗?

时间:2018-03-27 20:00:03

标签: python tensorflow

我正在尝试将张量添加到张量流控制循环内的python列表中。

我的代码:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    c = lambda i, limit: tf.less(i, limit)
    t = (1,5)
    x = []
    def loop_forward(i, limit):
        x.append(1)
        return tf.tuple([i + 1, limit])
    loop = tf.while_loop(c, loop_forward, loop_vars=t, back_prop=False, name="loop")[0]
    with tf.control_dependencies([loop]):
        b = tf.stack(x)

with tf.Session(graph=graph) as sess:
    print(sess.run(b))

这会产生[1],但不会像我期望的那样产生[1,1,1,1]。知道为什么吗?

按照大卫的回答,我试着这样做:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    c = lambda i, limit: tf.less(i, limit)
    t = (1,5)
    v = tf.convert_to_tensor([1])
    with tf.control_dependencies([v]):
        def loop_forward(i, limit):
            v = tf.concat([v,tf.convert_to_tensor([1])], axis=0)
            return tf.tuple([i + 1, limit])
        loop = tf.while_loop(c, loop_forward, loop_vars=t, back_prop=False, name="loop")[0]
        with tf.control_dependencies([loop]):
            b = v

with tf.Session(graph=graph) as sess:
    print(sess.run(b))

这似乎产生了这个错误:

Traceback (most recent call last):
  File "test-looping-3.py", line 12, in <module>
    loop = tf.while_loop(c, loop_forward, loop_vars=t, back_prop=False, name="loop")[0]
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2934, in while_loop
    result = loop_context.BuildLoop(cond, body, loop_vars, shape_invariants)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2720, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2662, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "test-looping-3.py", line 10, in loop_forward
    v = tf.concat([v,tf.convert_to_tensor([1])], axis=0)
UnboundLocalError: local variable 'v' referenced before assignment

但是v不是变量,而是Tensor,所以不确定这个错误是怎么来的。

1 个答案:

答案 0 :(得分:3)

简短的回答:循环中没有TF中的python。

您只能在while循环中使用张量流构造。 x.append(1)是一个python构造。

事实上,这里有一个关于TF while循环的重要琐事,loop_forward只会被称为一次。这是因为它只定义了TF图操作。 Tensorflow将根据您的条件c = lambda i, limit: tf.less(i, limit)多次运行这些操作。

有了这一点琐事,应该清楚为什么将loop_forward视为传统蟒蛇意义上的循环是错误的。

然而,您可以实现目标,只需使用tensorflow构造即可。 tf.concat可能是你想用来将一个值连接到一个张量的末尾。 Tensorflow中的一切都是张量。