我可以在tensorflow控制循环中改变python列表吗

2024-04-23 15:45:44 发布

您现在位置: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,所以不确定这个错误是如何产生的。你知道吗


Tags: inpylooptftensorflowaswithline
1条回答
网友
1楼 · 发布于 2024-04-23 15:45:44

简而言之:tfwhile循环中没有python。你知道吗

只能在tensorflow while循环中使用tensorflow构造。x.append(1)是一个python构造。你知道吗

事实上,这里有一个关于TF while循环的有趣的小细节,loop_forward将只被称为一次。这是因为它只定义TF-graph操作。Tensorflow将根据您的条件多次运行这些操作c = lambda i, limit: tf.less(i, limit)。你知道吗

有了这些琐事,应该很清楚为什么在传统的python意义上把loop_forward当作循环是错误的。你知道吗

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

相关问题 更多 >