Tensorflow:TFRecord 文件的预处理是否比实时数据预处理更快?
Tensorflow: Is preprocessing on TFRecord files faster than real-time data preprocessing?
在 Tensorflow 中,似乎可以在训练期间、从原始图像(或数据)创建批处理时或图像已经是静态时进行预处理。鉴于理论上,预处理应该花费大致相等的时间(如果它们使用相同的硬件完成),是否有任何 实用训练前进行数据预处理(甚至数据扩充)与实时训练相比有什么缺点?
作为附带问题,如果在训练期间未进行数据扩充,甚至可以在 Tensorflow 中进行数据扩充吗?
我一直在想同样的事情,并对我的 during-training-time 图像处理性能感到失望。我花了一段时间才意识到图像处理的开销有多大。
我要给自己做一个肥美多汁的 preprocessed/augmented 数据文件。 运行 一夜之间,然后第二天来,效率翻倍!
我使用的是单 GPU 机器,对我来说很明显 piece-by-piece 模型构建是可行的方法。但是,如果您的硬件不同,workflow-maths 可能看起来会有所不同。例如,在我的 Macbook-Pro 上,tensorflow 很慢(在 CPU 上),图像处理速度非常快,因为它是在笔记本电脑的 GPU 上自动完成的。现在我已经转移到合适的 GPU 机器,tensorflow 运行 快 20 倍,图像处理是瓶颈。
只需计算出您的 augmentation/preprocessing 需要多长时间,计算出您将多久重复使用一次,然后进行计算。
Is there any practical disadvantage in doing data preprocessing (or
even data augmentation) before training than during training in
real-time?
是的,有优点(+++)也有缺点(---):
训练前预处理:
- ---预处理样本需要存储:磁盘space消耗*(1)
- ---只能生成"finite"个样本
- +++ 训练期间无运行时间
- ---...但样本总是需要从存储中读取,即可能存储(磁盘)I/O成为瓶颈
- --- 不灵活:更改 datset/augmentation 需要生成新的扩充数据集
- +++ for Tensorflow:使用任何 high-level 图像 API 轻松处理 numpy.ndarray 或其他数据格式(open-cv, PIL, ...) 进行增强,甚至使用您喜欢的任何其他 language/tool。
预处理训练期间 ("real-time"):
- +++ 可以生成无限数量的样本(因为它是生成的on-the-fly)
- +++灵活:改dataset/augmentation只需要改代码
- +++ 如果数据集在内存中,读取一次后数据不需要磁盘I/O
- --- 为您的训练增加运行时间* (2)
- --- for Tensorflow:将预处理构建为 graph 的一部分需要使用 Tensors 并限制使用 API正在处理 ndarrays 或其他格式。* (3)
详细讨论的一些具体方面:
(1) 重现实验 "with the same data"对于训练前生成的数据集来说有点简单。然而,这可以通过存储用于 real-time 数据生成的种子来优雅地解决(甚至更多!)。
(2): 预处理的训练运行时间: 有是避免昂贵的预处理管道妨碍实际训练的方法。 Tensorflow 本身建议用许多 (CPU-)threads
填充 Queues
,以便数据生成可以独立跟上 GPU 数据消耗。您可以在 input pipeline performance guide.
中阅读更多相关信息
(3): tensorflow中的数据扩充
As a side question, could data augmentation even be done in Tensorflow
if was not done during (I think you mean) before training?
是的,tensorflow 提供了一些功能来进行扩充。就 scalar/vector(或更多维数据)的价值增加而言,您可以使用 tf.multiply
或其他基本数学操作轻松地自己构建一些东西。对于图像数据,实现了几个操作(参见 tf.image and tf.contrib.image),应该涵盖很多增强需求。
有off-the-shelf preprocessing examples on github, one of which is used and described in the CNN tutorial (cifar10).
就个人而言,我总是会尝试使用 real-time 预处理,因为生成(可能很大的)数据集感觉很笨重。但它是完全可行的,我已经看到它做了很多次而且(正如你在上面看到的)它肯定有它的优势。
在 Tensorflow 中,似乎可以在训练期间、从原始图像(或数据)创建批处理时或图像已经是静态时进行预处理。鉴于理论上,预处理应该花费大致相等的时间(如果它们使用相同的硬件完成),是否有任何 实用训练前进行数据预处理(甚至数据扩充)与实时训练相比有什么缺点?
作为附带问题,如果在训练期间未进行数据扩充,甚至可以在 Tensorflow 中进行数据扩充吗?
我一直在想同样的事情,并对我的 during-training-time 图像处理性能感到失望。我花了一段时间才意识到图像处理的开销有多大。
我要给自己做一个肥美多汁的 preprocessed/augmented 数据文件。 运行 一夜之间,然后第二天来,效率翻倍!
我使用的是单 GPU 机器,对我来说很明显 piece-by-piece 模型构建是可行的方法。但是,如果您的硬件不同,workflow-maths 可能看起来会有所不同。例如,在我的 Macbook-Pro 上,tensorflow 很慢(在 CPU 上),图像处理速度非常快,因为它是在笔记本电脑的 GPU 上自动完成的。现在我已经转移到合适的 GPU 机器,tensorflow 运行 快 20 倍,图像处理是瓶颈。
只需计算出您的 augmentation/preprocessing 需要多长时间,计算出您将多久重复使用一次,然后进行计算。
Is there any practical disadvantage in doing data preprocessing (or even data augmentation) before training than during training in real-time?
是的,有优点(+++)也有缺点(---):
训练前预处理:
- ---预处理样本需要存储:磁盘space消耗*(1)
- ---只能生成"finite"个样本
- +++ 训练期间无运行时间
- ---...但样本总是需要从存储中读取,即可能存储(磁盘)I/O成为瓶颈
- --- 不灵活:更改 datset/augmentation 需要生成新的扩充数据集
- +++ for Tensorflow:使用任何 high-level 图像 API 轻松处理 numpy.ndarray 或其他数据格式(open-cv, PIL, ...) 进行增强,甚至使用您喜欢的任何其他 language/tool。
预处理训练期间 ("real-time"):
- +++ 可以生成无限数量的样本(因为它是生成的on-the-fly)
- +++灵活:改dataset/augmentation只需要改代码
- +++ 如果数据集在内存中,读取一次后数据不需要磁盘I/O
- --- 为您的训练增加运行时间* (2)
- --- for Tensorflow:将预处理构建为 graph 的一部分需要使用 Tensors 并限制使用 API正在处理 ndarrays 或其他格式。* (3)
详细讨论的一些具体方面:
(1) 重现实验 "with the same data"对于训练前生成的数据集来说有点简单。然而,这可以通过存储用于 real-time 数据生成的种子来优雅地解决(甚至更多!)。
(2): 预处理的训练运行时间: 有是避免昂贵的预处理管道妨碍实际训练的方法。 Tensorflow 本身建议用许多 (CPU-)
threads
填充Queues
,以便数据生成可以独立跟上 GPU 数据消耗。您可以在 input pipeline performance guide. 中阅读更多相关信息
(3): tensorflow中的数据扩充
As a side question, could data augmentation even be done in Tensorflow if was not done
during(I think you mean) before training?是的,tensorflow 提供了一些功能来进行扩充。就 scalar/vector(或更多维数据)的价值增加而言,您可以使用
tf.multiply
或其他基本数学操作轻松地自己构建一些东西。对于图像数据,实现了几个操作(参见 tf.image and tf.contrib.image),应该涵盖很多增强需求。有off-the-shelf preprocessing examples on github, one of which is used and described in the CNN tutorial (cifar10).
就个人而言,我总是会尝试使用 real-time 预处理,因为生成(可能很大的)数据集感觉很笨重。但它是完全可行的,我已经看到它做了很多次而且(正如你在上面看到的)它肯定有它的优势。