下面的代码有什么问题?如果tf.assign op发生在循环之外,则将其应用于tf.Variable的一个片段时,它工作得很好。但是,在这种情况下,它给出了下面的错误。
import tensorflow as tf
v = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
n = len(v)
a = tf.Variable(v, name = 'a')
def cond(i, a):
return i < n
def body(i, a):
tf.assign(a[i], a[i-1] + a[i-2])
return i + 1, a
i, b = tf.while_loop(cond, body, [2, a]) 在以下方面的成果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/hrbigelow/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 3210, in while_loop
result = loop_context.BuildLoop(cond, body, loop_vars, shape_invariants)
File "/home/hrbigelow/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2942, in BuildLoop
pred, body, original_loop_vars, loop_vars, shape_invariants)
File "/home/hrbigelow/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2879, in _BuildLoop
body_result = body(*packed_vars_for_body)
File "/home/hrbigelow/ai/lb-wavenet/while_var_test.py", line 11, in body
tf.assign(a[i], a[i-1] + a[i-2])
File "/home/hrbigelow/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/state_ops.py", line 220, in assign
return ref.assign(value, name=name)
File "/home/hrbigelow/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 697, in assign
raise ValueError("Sliced assignment is only supported for variables")
ValueError: Sliced assignment is only supported for variables发布于 2018-07-08 09:35:40
您的变量不是在循环中运行的操作的输出,而是存在于循环之外的外部实体。所以你不需要提供它作为一个论点。
此外,您还需要强制进行更新,例如在tf.control_dependencies中使用body。
import tensorflow as tf
v = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
n = len(v)
a = tf.Variable(v, name = 'a')
def cond(i):
return i < n
def body(i):
op = tf.assign(a[i], a[i-1] + a[i-2])
with tf.control_dependencies([op]):
return i + 1
i = tf.while_loop(cond, body, [2])
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
i.eval()
print(a.eval())
# [ 1 1 2 3 5 8 13 21 34 55 89]可能您希望保持谨慎,并设置parallel_iterations=1以强制循环按顺序运行。
发布于 2018-07-08 07:15:06
从CUDA的角度来看,不允许分配单个索引是有意义的,因为它否定了异构并行计算的所有性能好处。
我知道这会增加一些计算开销,但它是有效的。
import tensorflow as tf
v = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
n = len(v)
a = tf.Variable(v, name = 'a',dtype=tf.float32)
def cond(i, a):
return i < n
def body(i, a1):
e = tf.eye(n,n)[i]
a1 = a1 + e *(a1[i-1] + a1[i-2])
return i + 1, a1
i, b = tf.while_loop(cond, body, [2, a])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('i: ',sess.run(i))
print('b: ',sess.run(b))https://stackoverflow.com/questions/51225805
复制相似问题