为什么TensorFlow中的RandomShuffleQueue会使相同的值出列?

时间:2017-07-01 06:05:41

标签: python tensorflow

我想在TensorFlow中测试RandomShuffleQueue。队列首先将变量排队三次,其值增加1.0,因此队列应该像[1.,2.,3。]。然后出列两次。我预计输出会从1,2,3中随机选择。但它总是输出3,这很令人困惑。

测试代码如下所示:

import tensorflow as tf

i = tf.Variable(0.0)
one = tf.constant(1.0)
ass_op = tf.assign(i, tf.add(i, one))

q = tf.RandomShuffleQueue(10, min_after_dequeue=1, dtypes=tf.float32)
enq_op = q.enqueue([ass_op])
deq_op = q.dequeue()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run([q.size(), ass_op, enq_op]))
    print(sess.run([q.size(), ass_op, enq_op]))
    print(sess.run([q.size(), ass_op, enq_op]))
    print(sess.run([q.size(), deq_op]))
    print(sess.run([q.size(), deq_op]))

,输出为:

[0, 1.0, None]
[1, 2.0, None]
[2, 3.0, None]
[3, 3.0]
[2, 3.0]

更新: 我发现这个问题只出现在Mac OS中,而Linux和Windows中的测试工作正常。而且,FIFOQueue也有同样的问题。更详细的测试代码如下:

import tensorflow as tf

i = tf.Variable(0.0)
ass_op = tf.assign(i, i+1.0)

q = tf.FIFOQueue(20, dtypes=tf.float32)
enq_op = q.enqueue([ass_op])
deq_op = q.dequeue()

sess = tf.Session()

sess.run(tf.global_variables_initializer())

# code 1
for i in range(10):
    sess.run(enq_op)  
for i in range(10):
    print(sess.run(deq_op))

# code 2
for i in range(10):
    sess.run(enq_op)
    print(sess.run(deq_op))

虽然代码2按预期工作,但代码1仅在Mac OS中出错。

2 个答案:

答案 0 :(得分:0)

你的代码很好,它工作正常。可能是这样的情况,当你运行代码时,你得到了相同的输出几次。这是可能的。

我运行了您的代码并对其进行了一些更改,以下代码对我来说运行正常:

import tensorflow as tf

i = tf.Variable(0.0)
one = tf.constant(1.0)
ass_op = tf.assign(i, tf.add(i, one))

q = tf.RandomShuffleQueue(10, min_after_dequeue=1, dtypes=tf.float32)
enq_op = q.enqueue([ass_op])
deq_op = q.dequeue()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(3):
        print(sess.run([q.size(), ass_op, enq_op]))
    for i in range(2):
        print(sess.run([q.size(), deq_op]))

输出:

[0, 1.0, None]
[1, 2.0, None]
[2, 3.0, None]
[3, 1.0]
[2, 3.0]
--
[0, 1.0, None]
[1, 2.0, None]
[2, 3.0, None]
[3, 3.0]
[2, 2.0]

答案 1 :(得分:0)

在我看来,您正在为队列添加相同的元素(分配部分时出现问题)。

这是一个随机抽取元素的随机队列:

import tensorflow as tf

q = tf.RandomShuffleQueue(10, min_after_dequeue=1, dtypes=tf.float32)
init = q.enqueue_many(([1., 2., 3., 4., 5., 6., 7.],))
res  = q.dequeue()
with tf.Session() as sess:
    sess.run(init)
    for i in xrange(5):
        print sess.run(res)