我正在尝试将张量添加到张量流控制循环内的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
,所以不确定这个错误是怎么来的。
答案 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中的一切都是张量。