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

时间:2017-01-23 12:14:33

标签: python machine-learning tensorflow computer-vision deep-learning

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

作为一个附带问题,如果在培训期间没有完成数据扩充甚至可以在Tensorflow中完成吗?

2 个答案:

答案 0 :(得分:3)

  

在进行数据预处理时是否存在任何实际缺点(或   甚至数据增加)在训练之前比在训练期间   实时?

是的,有优势( +++ )和劣势( --- ):

培训前预处理

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

在培训期间预处理 (&#34; 实时 &#34;):

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

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

  • (1) 重播实验 &#34;使用相同的数据&#34;在训练之前生成的数据集很简单。然而,这可以通过存储用于实时数据生成的种子来优雅地解决(甚至更多!)。

  • (2) 用于预处理的训练运行时 :有一些方法可以避免昂贵的预处理管道妨碍你的实际训练。 Tensorflow本身建议使用许多(CPU - )Queues填充threads,以便数据生成可以独立地跟上GPU数据消耗。您可以在input pipeline performance guide

  • 中详细了解相关信息
  • (3) 张量流中的数据扩充

      

    作为一个附带问题,数据扩充甚至可以在Tensorflow中完成   如果没有完成 (我认为你的意思是) 之前 培训?

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

    github上有现成的preprocessing examples,其中一个在CNN tutorial(cifar10)中使用和描述。

就个人而言,我总是会尝试使用实时预处理,因为生成(可能很大)的数据集感觉很笨拙。但它完全可行,我已经多次看到它(如上所述)它肯定有它的优点。

答案 1 :(得分:2)

我一直想知道同样的事情,并且对我的训练期间图像处理性能感到失望。我花了一段时间才意识到图像处理的开销有多大。

我将使自己成为一个很好的肥胖多汁的预处理/增强数据文件。一夜之间运行,然后在第二天运行,效率提高两倍!

我正在使用一台GPU机器,对我来说很明显,逐件模型构建是最佳选择。但是,如果您有不同的硬件,工作流数学可能看起来不同。例如,在我的Macbook-Pro上,张量流速很慢(在CPU上)并且图像处理速度很快,因为它是在笔记本电脑的GPU上自动完成的。现在我已经转移到一台合适的GPU机器,tensorflow运行速度提高了20倍,图像处理成为瓶颈。

计算出你的增强/预处理需要多长时间,找出你重复使用它的频率然后再进行数学运算。

相关问题