我有一个大约1M个例子的数据集。我将每个示例都添加到一个单独的.tfrecord文件中,这导致大约500GB的文件位于某个网络位置。
从这个网络位置读取多个小文件非常慢,所以我正在考虑将大约100个示例分组到一个.tfrecord文件中。
我很担心,来自同一个.tfrecords文件的示例将始终出现在同一个小批量(或一个小批量接一个)之后,这对于我想要的训练数据的正确混合是不利的。
我的输入管道如下:
我有tf.train.string_input_producer(files, capacity=100000)
文件名队列,使用TFRecordReader.read
从文件名队列中读取,并使用tf.train.batch
创建示例队列并使用dequeue_many
从中返回批处理
我担心,一旦文件名队列出列文件名,其中的所有示例都将被读取并排入tf.train.batch
创建的示例FIFO队列中,这将导致相同的示例位于同一个小区中。过度。
它是否真的会在同一个小批量中反复使用相同的例子?如果是这样,我应该为示例创建一个Shuffle队列,而不是使用tf.train.batch
吗?
答案 0 :(得分:2)
TFRecord的一个要点是将许多文件存储在同一位置,以克服打开/关闭许多文件的问题。因此,根据一个示例,您对一个tfrecord的方法没有意义。您甚至可以将所有示例放在一个文件中,也可以将每个文件放入10k。关于改组:有两种类型的洗牌,用于不同的目的并改变不同的东西:
tf.train.string_input_producer
shuffle:Boolean。如果为true,则在每个纪元内随机改组字符串。。因此,如果您有一些文件['file1', 'file2', ..., 'filen']
,则会从此列表中随机选择一个文件。如果是false,则文件会一个接一个地跟着。tf.train.shuffle_batch
通过随机调整张量来创建批量。因此,您的队列需要batch_size
个张量(您需要创建一个tf.train.start_queue_runners
的队列)洗他们。