在一个.tfrecords文件

时间:2017-07-04 15:33:38

标签: tensorflow

我有一个大约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吗?

1 个答案:

答案 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的队列)洗他们。