Tensorflow: 在TFRecord文件上进行预处理比实时数据预处理更快吗?

在Tensorflow中,预处理似乎可以在训练时进行,即在从原始图像(或数据)创建批次时进行,或者在图像已经静态时进行。鉴于理论上,如果使用相同的硬件,预处理应耗时大致相同,那么在训练前进行数据预处理(甚至数据增强)是否存在实际上的劣势呢?

作为一个附带问题,如果不在训练过程中进行数据增强,那么在Tensorflow中是否可以进行数据增强?


回答:

在训练前进行数据预处理(甚至数据增强)是否存在实际上的劣势?

是的,存在优点(+++)和缺点():

训练前进行预处理:

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

训练过程中进行预处理(“实时”):

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

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

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

  • (2): 训练时的预处理运行时间:有方法可以避免昂贵的预处理流程干扰实际训练。Tensorflow本身建议使用许多(CPU-)threads填充Queues,这样数据生成可以独立地跟上GPU数据消耗。你可以在输入管道性能指南中了解更多信息。

  • (3): Tensorflow中的数据增强

    作为一个附带问题,如果不在训练进行数据增强,那么在Tensorflow中是否可以进行数据增强?

    是的,tensorflow提供了一些功能来进行增强。对于标量/向量(或更多维数据)的值增强,你可以轻松地使用tf.multiply或其他基本数学操作构建一些东西。对于图像数据,实现了几种操作(见tf.imagetf.contrib.image),这些应该能满足很多增强需求。

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


就个人而言,我总是会尝试使用实时预处理,因为生成(可能非常大)的数据集感觉很笨拙。但这完全可行,我见过很多次这样做(如你所见)它确实有它的优势。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注