标签:python tensorflow
如何使Tensor Flow图形将递增的数字推送到队列?
我只是为了学习目的这样做,所以我更喜欢你保持它与我正在做的相似(并纠正我做错了).这是我的代码:
import tensorflow as tf
# create queue
queue = tf.RandomShuffleQueue(capacity=10, min_after_dequeue=1, dtypes=tf.float32)
# create variables, and "add" operation
push_var = tf.Variable(initial_value=1.0, trainable=False)
add = push_var.assign_add(1)
# enqueue operation
push = queue.enqueue(add)
# dequeue operation
pop = queue.dequeue()
sess = tf.InteractiveSession()
tf.initialize_all_variables().run()
# add var to stack
sess.run(push) # push_var = 2 after ran
sess.run(push) # push_var = 3 after ran
sess.run(push) # push_var = 4 after ran
sess.run(push) # push_var = 5 after ran
sess.run(push) # push_var = 6 after ran
sess.run(push) # push_var = 7 after ran
sess.run(push) # push_var = 8 after ran
# pop variable (random shuffle)
print sess.run(pop)
print sess.run(pop)
sess.close()
输出:
8
8
我期待它是2到8之间的2个随机数.相反,它总是弹出变量的当前值.
这是因为而不是推动变量的实际值而是推动指向变量的指针? Tensor Flow的documentation表示assign_add返回
A Tensor that will hold the new value of this variable after the
addition has completed.
我再次尝试了解Tensor Flow.如果您有任何学习资源(除了TensorFlow网站),我会很感激!谢谢.
编辑:
将push = queue.enqueue(add)更改为push = queue.enqueue(add 0)会导致预期的行为.有人可以解释一下吗?
解决方法:
@David Wong是正确的,变量只是对其基础张量的引用.即使你已经推了7次,队列中的7个元素都指向相同的底层张量.执行pop时,将引用并返回基础张量.
让我再解释一下. assign_add(1)只是更新引用的值,因此它返回一个引用.当你执行push = queue.enqueue(add)时,它会在内部调用tf.convert_to_tensor(add)
,如果它的输入也是引用,它将返回一个引用.
您可以在python shell中检查tf.convert_to_tensor(add)的输出:
In [2]: tf.convert_to_tensor(add)
Out[2]: <tf.Tensor 'AssignAdd:0' shape=() dtype=float32_ref>
dtype = float32_ref表示它是一个引用.
对于add 0,你也可以在ipython shell中检查它,这相当于tf.add(add,0):
In [3]: add+0
Out[3]: <tf.Tensor 'add:0' shape=() dtype=float32>
它不是引用,并且具有父节点add = push_var.assign_add(1).
所以这里的问题是
1)当一个张量被推送到一个队列时,它将被评估,它的所有父节点也将被评估.
在您的情况下,将评估add 0,因此其父节点add = push_assign_add(1)也会将参考值增加1.
2)推送到队列时不评估引用.队列中只有引用.弹出并引用它们时,将获取它们的实际张量值.
在您的情况下,所有这些引用都指向相同的张量.所以流行音乐都返回8.
标签:python,tensorflow 来源: https://codeday.me/bug/20190627/1309226.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。