在Tensorflow读数数据教程中,给出了一个示例输入管道.在该管道中,数据被洗牌两次,无论是在内部string_input_producer
还是在内部shuffle batch generator
.这是代码:
def input_pipeline(filenames, batch_size, num_epochs=None): # Fist shuffle in the input pipeline filename_queue = tf.train.string_input_producer( filenames, num_epochs=num_epochs, shuffle=True) example, label = read_my_file_format(filename_queue) min_after_dequeue = 10000 capacity = min_after_dequeue + 3 * batch_size # Second shuffle as part of the batching. # Requiring min_after_dequeue preloaded images example_batch, label_batch = tf.train.shuffle_batch( [example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=min_after_dequeue) return example_batch, label_batch
第二次洗牌是否有用?混洗批量生成器的缺点在于,min_after_dequeue
示例总是被预先存储在存储器中以允许有用的混洗.我的图像数据确实很大,内存消耗很大.这就是我考虑使用的原因normal batch generator
.将数据混洗两次有什么好处吗?
编辑:附加问题,为什么string_input_producer
初始化只有默认容量32?将batch_size的倍数作为容量不是有利的吗?
是的 - 这是一种常见的模式,它以最一般的方式显示.在string_input_producer
洗牌中数据文件的读取次序.为了提高效率,每个数据文件通常包含许多示例.(读取一百万个小文件非常慢;最好每个1000个例子读取1000个大文件.)
因此,来自文件的示例被读入混洗队列,其中它们以更精细的粒度进行混洗,使得来自相同文件的示例不总是以相同的顺序训练,并且在输入文件之间混合.
有关更多详细信息,请参阅在tensorflow中与许多输入数据文件进行良好混合
如果你的文件每个只包含一个输入示例,你不需要多次洗牌,只能使用a string_input_producer
,但请注意,你仍然可以从阅读后拥有一些图像的队列中受益,这样你就可以了可以重叠您的网络的输入和培训.在queue_runner
一个batch
或shuffle_batch
将在一个单独的线程中运行,确保I/O在后台发生的事情,并且图像随时为您提供培训.而且,当然,创建微型飞机以进行训练通常是很好的速度.