tf.train.shuffle_batch打乱顺序输出数据

tf.train.shuffle_batch 该函数怎么输出数据的? tf.train.shuffle_batch主要有三个参数:batch_size,capacity,min_after_dequeue。这三个数据决定了怎么输出数据,数据有多乱。
首先我们知道tfrecord输出是按照队列输出的,那么我们一次从tfrecord加多少容量的队列呢?这个参数就是capacity。注意,此时首先加载一定量(capacity)的数据是按照tfrecord顺序的。在加载一定量capacity的数据后,才进行打乱,出队列需要的数据(也就是出队出batch size量的数据供我们的模型训练加载)。而min_after_dequeue代表了该capacity容量下的队列中元素的最小数量,用于确保元素的混合程度,也就是说,该队列在不断的输出数据后,其容量不能低于min_after_dequeue的数值,若低于就应该又从tfrecord中加载数据入队,那很显然的,若min_after_dequeue的值较大接近capacity的话,那么其实就是输出数据后,队列值不满足最小量,又从tfrecord加了新的数据,就增加了其混合程度。
如下代码所示,这也是为什么上述三者参数常常选择这一标准,当队列输出三个以上batch size量的数据后,即不满足了队列最小容量,才又加新数据。

capacity = min_after_dequeue+3*batch_size

【tf.train.shuffle_batch打乱顺序输出数据】但是,我在自己做图像数据集时候在这里也发现了个问题,我的图像是分组加载进去tfrecord的,而我的batch size较小,capacity,min_after_dequeue很大,所以尽管输出数据后就重新从tfrecord加载了新的数据,但是原始留在队列中的数据已经很多了,还是在继续打乱原始的数据,而没有获取新的数据。终于找到了个人数据集量小的原因。
PS:我在自己加载图片数据集时候,经实验结果推测入队是按照顺序的,若有错误请斧正。

    推荐阅读