首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tf.assign到变量片在tf.while_loop中不工作

tf.assign到变量片在tf.while_loop中不工作
EN

Stack Overflow用户
提问于 2018-07-07 18:14:22
回答 2查看 1.3K关注 0票数 5

下面的代码有什么问题?如果tf.assign op发生在循环之外,则将其应用于tf.Variable的一个片段时,它工作得很好。但是,在这种情况下,它给出了下面的错误。

代码语言:javascript
运行
复制
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]) 

在以下方面的成果:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-07-08 07:15:06

从CUDA的角度来看,不允许分配单个索引是有意义的,因为它否定了异构并行计算的所有性能好处。

我知道这会增加一些计算开销,但它是有效的。

代码语言:javascript
运行
复制
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))
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51225805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档