python – Tensor Flow中的入队和增量变量

如何使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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐