【问题标题】:Tensorflow Tutorial: Duplicated Shuffling in the Input PipelineTensorflow 教程:输入管道中的重复混洗
【发布时间】:2015-12-19 14:36:25
【问题描述】:

Tensorflow reading data tutorial 中给出了一个示例输入管道。在该管道中,数据被洗牌两次,在string_input_producershuffle 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

第二次洗牌有什么用处吗? shuffle 批处理生成器的缺点是min_after_dequeue 示例总是预先加载在内存中以允许有用的 shuffle。我确实有图像数据,这在内存消耗方面非常重要。这就是为什么我考虑改用normal batch generator。将数据洗牌两次有什么好处吗?

编辑:附加问题,为什么 string_input_producer 仅使用默认容量 32 初始化?将 batch_size 的倍数作为容量不是很有利吗?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    是的 - 这是一种常见的模式,并且以最一般的方式显示。 string_input_producer 打乱读取数据文件的顺序。为了提高效率,每个数据文件通常包含许多示例。 (读取一百万个小文件非常慢;最好读取 1000 个大文件,每个文件 1000 个示例。)

    因此,来自文件的示例被读入一个混洗队列,在那里它们以更精细的粒度进行混洗,因此来自同一文件的示例并不总是以相同的顺序进行训练,并且可以在整个输入文件。

    更多详情请见Getting good mixing with many input datafiles in tensorflow

    如果您的每个文件都只包含一个输入示例,则您不需要多次随机播放,并且只需 string_input_producer 就可以逃脱,但请注意,您仍然可能会受益于拥有一个包含几张图像的队列读完之后,这样你就可以将你的网络的输入和训练重叠起来。用于batchshuffle_batchqueue_runner 将在单独的线程中运行,确保I/O 在后台发生并且图像始终可用于训练。而且,当然,创建小批量进行训练通常会提高速度。

    【讨论】:

      【解决方案2】:

      这两种洗牌都有不同的用途,洗牌的东西也不同:

      • tf.train.string_input_producer 随机播放:布尔值。如果为 true,则字符串在每个 epoch 内随机打乱。。因此,如果您有几个文件['file1', 'file2', ..., 'filen'],则会从该列表中随机选择一个文件。如果为 false,则文件一个接一个。
      • tf.train.shuffle_batch 通过随机打乱张量来创建批次。因此它从队列read_my_file_format 中取出 batch_size 张量并打乱它们。

      因为两个 shuffle 做不同的事情,所以对数据进行两次 shuffle 是有优势的。即使您使用一批 256 张图像,并且每张图像都是 256x256 像素,您也将消耗不到 100 Mb 的内存。如果在某些时候您会看到内存问题,您可以尝试减小批量大小。

      关于默认容量 - 它是model specific。让它大于 batch_size 并确保它在训练期间永远不会为空是有意义的。

      【讨论】:

        【解决方案3】:

        为了回答附加问题,string_input_producer 返回一个队列,其中包含文件名称,其中包含样本,而不是样本本身。然后shuffle_batch 使用此文件名来加载数据。因此,加载的样本数量与 shuffle_batch 函数的 capacity 参数有关,而不是 string_input_producer

        【讨论】:

          猜你喜欢
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-25
          • 1970-01-01
          • 2017-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多