我想在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中出错。
答案 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)