Tensorflow 在一个.tfrecords文件中混合多个记录的属性

Tensorflow 在一个.tfrecords文件中混合多个记录的属性,tensorflow,Tensorflow,我有一个大约100万个例子的数据集。我将每个示例都添加到一个单独的.tfrecord文件中,这导致在某个网络位置大约有500GB 从这个网络位置读取多个小文件的速度非常慢,所以我考虑将大约100个示例分组到一个.tfrecord文件中 但是,我担心,来自同一.tfrecords文件的示例总是出现在同一个小批量中(或者一个小批量出现在另一个小批量中),这不利于正确混合我想要的训练数据 我的输入管道如下所示: 我有一个tf.train.string\u input\u producer(files,

我有一个大约100万个例子的数据集。我将每个示例都添加到一个单独的.tfrecord文件中,这导致在某个网络位置大约有500GB

从这个网络位置读取多个小文件的速度非常慢,所以我考虑将大约100个示例分组到一个.tfrecord文件中

但是,我担心,来自同一.tfrecords文件的示例总是出现在同一个小批量中(或者一个小批量出现在另一个小批量中),这不利于正确混合我想要的训练数据

我的输入管道如下所示: 我有一个
tf.train.string\u input\u producer(files,capacity=100000)
用于文件名队列,使用
TFRecordReader.read
读取文件名队列,使用
tf.train.batch
创建一个示例队列并使用
dequeue\u many
从中返回一个批

我担心一旦文件名队列将文件名出列,它的所有示例都将被读取并排入由
tf.train.batch
创建的示例FIFO队列,这将导致相同的示例反复出现在相同的小批量中


它真的会在同一个迷你批次中反复出现相同的示例吗?如果是这样,我是否应该创建一个随机队列作为示例,而不是使用
tf.train.batch

TFRecord的要点之一是将多个文件存储在同一位置,以克服打开/关闭多个文件的问题。因此,您对每个示例使用一个tfrecord的方法是没有意义的。您甚至可以将所有示例放在一个文件中,或者每个文件有10k。关于洗牌:有两种类型的洗牌服务于不同的目的和洗牌不同的东西:

  • 洗牌:布尔。如果为true,则字符串在每个历元内随机洗牌。。因此,如果您有几个文件
    ['file1'、'file2'、…、'filen']
    这会从列表中随机选择一个文件。如果为false,则文件将依次显示
  • 通过随机洗牌张量创建批次。因此,它从您的队列中获取
    batch\u size
    张量(您需要使用
    tf.train.start\u queue\u runner
    创建一个队列)并将其洗牌

TFRecord的要点之一是将多个文件存储在同一位置,以克服打开/关闭多个文件的问题。因此,您对每个示例使用一个tfrecord的方法是没有意义的。您甚至可以将所有示例放在一个文件中,或者每个文件有10k。关于洗牌:有两种类型的洗牌服务于不同的目的和洗牌不同的东西:

  • 洗牌:布尔。如果为true,则字符串在每个历元内随机洗牌。。因此,如果您有几个文件
    ['file1'、'file2'、…、'filen']
    这会从列表中随机选择一个文件。如果为false,则文件将依次显示
  • 通过随机洗牌张量创建批次。因此,它从您的队列中获取
    batch\u size
    张量(您需要使用
    tf.train.start\u queue\u runner
    创建一个队列)并将其洗牌

我认为在处理包含许多示例的文件时,必须提到tf.train.shuffle\u batch()的minu after\u dequeue参数。只要出列后的最小值足够大,就可以保证值的良好混合。但另一方面,假设每个tf.record文件包含100个示例,并且minu\u after\u dequeue=~100,那么您可以预期一批中的所有示例都来自同一个文件。我认为在处理包含许多示例的文件时,必须提到tf.train.shuffle\u batch()的minu after\u dequeue参数。只要出列后的最小值足够大,就可以保证值的良好混合。但另一方面,假设每个tf.record文件包含100个示例,并且minu\u after\u dequeue=~100,那么可以预期一批中的所有示例都来自同一个文件。