在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.image和tf.contrib.image),这些应该能满足很多增强需求。
就个人而言,我总是会尝试使用实时预处理,因为生成(可能非常大)的数据集感觉很笨拙。但这完全可行,我见过很多次这样做(如你所见)它确实有它的优势。