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:我在自己加载图片数据集时候,经实验结果推测入队是按照顺序的,若有错误请斧正。
推荐阅读
- Keras|将Pytorch模型迁移到android端(android studio)【未实现】
- Tensorflow|Tensorflow学习笔记----梯度下降
- Tensorflow【branch-官网代码实践-Eager/tf.data/Keras/Graph】_8.19
- nlp|Keras(十一)梯度带(GradientTape)的基本使用方法,与tf.keras结合使用
- tensorflow|tf1.x究竟到底如何如何使用Embedding?
- python|Keras TensorFlow 验证码识别(附数据集)
- AI|bert实现端到端继续预训练
- Tensorflow|cuda由7.0升级到8.0
- tensorflow|利用Tensorflow的队列多线程读取数据
- 深度学习|conda源,tensorflow2,pytorch安装