关于tf.train.shuffle_batch 中的参数 shuffle、min_after_dequeue
shuffle的作用在于指定是否需要随机打乱样本的顺序,一般作用于训练阶段,提高鲁棒性。
1、当shuffle = false时,每次dequeue是从队列中按顺序取数据,遵从先入先出的原则
2、当shuffle = true时,每次从队列中dequeue取数据时,不再按顺序,而是随机的,所以打乱了样本的原有顺序。
shuffle还要配合参数min_after_dequeue使用才能发挥作用。
这个参数min_after_dequeue的意思是队列中,做dequeue(取数据)的操作后,queue runner线程要保证队列中至少剩下min_after_dequeue个数据。
如果min_after_dequeue设置的过少,则即使shuffle为true,也达不到好的混合效果。
这个地方可能不太好理解,我尝试解释一下吧,但可能解释的不太好。
假设你有一个队列,现在里面有m个数据,你想要每次随机从队列中取n个数据,则代表先混合了m个数据,再从中取走n个。
当第一次取走n个后,队列就变为m-n个数据;
内向的音响下次再想要取n个时,假设队列在此期间插进来了k个数据,则现在的队列中有
(bzdtn)个数据,则此时会从混合的(bzdtn)个数据中随机取走n个,。如果队列填充的速度比较慢,k就比较小,那你取出来的n个数据只是与周围很小的一部分(bzdtn)个数据进行了混合。
因为我们的目的肯定是想尽最大可能的混合数据,因此设置min_after_dequeue,可以保证每次dequeue后都有足够量的数据填充尽队列,保证下次dequeue时可以很充分的混合数据。
但是min_after_dequeue也不能设置的太大,这样会导致队列填充的时间变长,尤其是在最初的装载阶段,会花费比较长的时间。
原文:https://blog.csdn.net/masa_fish/article/details/52624459
capacity是队列的长度
min_after_dequeue是出队后,队列至少剩下min_after_dequeue个数据
假设现在有个test.tfrecord文件,里面按从小到大顺序存放整数0~100
1. tf.train.batch是按顺序读取数据,队列中的数据始终是一个有序的队列,
比如队列的capacity=20,开始队列内容为0,1,..,19=>读取10条记录后,队列剩下10,11,..,19,然后又补充10条变成=>10,11,...,29,
队头一直按顺序补充,队尾一直按顺序出队,到了第100条记录后,又重头开始补充0,1,2...
2. tf.train.shuffle_batch是将队列中数据打乱后,再读取出来,因此队列中剩下的数据也是乱序的,队头也是一直在补充(我猜也是按顺序补充),
比如batch_size=5,capacity=10,min_after_dequeue=5,
初始是有序的0,1,..,9(10条记录),
然后打乱8,2,6,4,3,7,9,2,0,1(10条记录),
队尾取出5条,剩下7,9,2,0,1(5条记录),
然后又按顺序补充进来,变成7,9,2,0,1,10,11,12,13,14(10条记录),
再打乱13,10,2,7,0,12...1(10条记录),
再出队...
capacity可以看成是局部数据的范围,读取的数据是基于这个范围的,
在这个范围内,min_after_dequeue越大,数据越乱
原文:https://blog.csdn.net/ying86615791/article/details/73864381