Tensorflow:对 TFRecord 文件的预处理是否比实时数据预处理更快?

kwo*_*sin 4 python machine-learning computer-vision deep-learning tensorflow

在 Tensorflow 中,似乎可以在训练期间、从原始图像(或数据)创建批次时或图像已经静态时进行预处理。鉴于理论上,预处理应该花费大致相等的时间(如果它们使用相同的硬件完成),在训练之前进行数据预处理(甚至数据增强)是否比在实时训练期间有任何实际缺点?

作为一个附带问题,如果在训练期间不进行数据增强,甚至可以在 Tensorflow 中进行吗?

Hon*_*ear 5

与实时训练相比,在训练前进行数据预处理(甚至数据增强)是否有任何实际缺点?

是的,有优点(+++)和缺点(---):

训练前的预处理:

  • ---需要存储的预处理样本:磁盘空间消耗* (1)
  • ---只能生成“有限”数量的样本
  • +++训练期间没有运行时
  • --- ... 但样本总是需要从存储中读取,即可能存储(磁盘)I/O 成为瓶颈
  • ---不灵活:更改数据集/增强需要生成新的增强数据集
  • +++ for Tensorflow:使用任何高级图像 API(open-cv、PIL 等)轻松处理 numpy.ndarray 或其他数据格式以进行扩充,甚至使用您喜欢的任何其他语言/工具。

训练期间的预处理(“实时”):

  • +++可以生成无限数量的样本(因为它是即时生成的)
  • +++灵活:改变数据集/增强只需要改变代码
  • +++如果数据集适合内存,数据读取一次后无需磁盘 I/O
  • ---为您的训练增加运行时间* (2)
  • ---对于 Tensorflow:将预处理构建为图的一部分需要使用 Tensor 并限制使用处理 ndarrays 或其他格式的 API。* (3)

一些具体方面进行了详细讨论:

  • (1) 使用训练前生成的数据集重现“使用相同数据”的实验有点简单。然而,这可以通过存储用于实时数据生成的种子来优雅地解决(甚至更多!)。

  • (2)预处理的训练运行时间:有一些方法可以避免昂贵的预处理管道妨碍您的实际训练。Tensorflow 本身建议填充Queues很多(CPU-),threads以便数据生成可以独立地跟上 GPU 数据消耗。您可以在输入管道性能指南中阅读有关此内容的更多信息。

  • (3):张量流中的数据增强

    作为一个方面的问题,可以增强数据甚至可以在Tensorflow做,如果没有完成 (我想你的意思) 培训?

    是的,tensorflow 提供了一些增强的功能。在标量/向量(或更多维数据)的值增加方面,您可以轻松地自己构建一些东西tf.multiply或其他基本的数学运算。对于图像数据,实现了几个操作(参见tf.imagetf.contrib.image),它们应该涵盖很多增强需求。

    github 上有现成的预处理示例,其中之一在CNN 教程(cifar10) 中使用和描述。


就我个人而言,我总是尝试使用实时预处理,因为生成(可能很大)数据集感觉很笨重。但它是完全可行的,我已经多次看到它并且(如你所见)它绝对有它的优势。