我正在关注cifar10 tutorial并使用inputs()调用的cifar10.inputs函数获取我的数据。我的代码如下:
import tensorflow as tf
import cifar10
# Get images and labels
images, labels = cifar10.inputs(eval_data='test')
# Start running operations on the Graph.
sess = tf.Session()
sess.run(tf.initialize_all_variables())
# Start the queue runners.
tf.train.start_queue_runners(sess=sess)
img, lab = sess.run([images, labels])
print(lab)
为了测试这一点,我运行批量大小为10的代码并打印第一批的标签。我希望每次执行此代码时输出相同,因为inputs()函数中的 shuffle = False 。但是,我在每次执行中都观察到略有不同的标签,例如三次连续执行的输出是:
run-1: [0 1 2 2 1 1 1 9 8 8]
run-2: [1 2 2 0 1 1 1 9 8 8]
run-3: [0 2 2 1 1 1 1 9 8 8]
我想知道:
答案 0 :(得分:2)
您启动的队列运行程序有多个线程从磁盘加载数据并将其添加到队列中。 There are 16 of them by default。
队列本身是线程安全的,但没有强制执行顺序。
因此,即使您没有使用洗牌队列,获取和插入项目的线程之间的竞争条件也会略微随机化。
使其完全可重复的最简单方法是仅使用1个线程来获取项目。这可能会很慢。