2014-02-26 60 views
7

我正在用cudaconvnet和Daniel Nouri的noccn模块进行图像分类,并希望通过拍摄大量原始图像的补丁(并翻转它)来实现数据增强。什么时候最适合发生这种情况?用卷积神经网络实现图像分类的数据增强

我已经确定了3个阶段在训练过程中何时能:给定一个批次
一)从数据创建批处理时,
B)获得下一批何时训练
C),获得当下一张图片以进入网络

在我看来,a)的优势在于我可以将增强数据分散到所有批次中。但它将占用磁盘空间的1000倍原始数据集已经是1TB,因此完全不可行。

b)和c)不涉及将新数据存储在磁盘上,但可以批量分散数据吗?如果我不这样做,那么假设我有batch_size == 128,并且我可以扩充我的数据1000x,那么接下来的8批将包含来自同一类的图像。训练网络并不坏,因为每个训练样本根本不会被随机化?此外,如果我选择b)或c)并从k个训练样例中创建一个新批次,那么数据增加n次将使批量n * k而不是多次批量n次。

例如,在我的情况下,我有batchsize == 128,可以预计1000倍数据增强。因此,每个批次实际上的大小为128 * 1000,我会得到的是更精确的偏导数估计值(对于无用的程度,因为batchsize == 128k是无意义的高)。

那我该怎么办?

回答

6

没错,你希望扩大样本,使其随机散布在整个数据的其余部分。否则,你肯定会遇到你提到的问题,因为批次不会被正确采样,你的梯度下降步骤将会过于偏见。我对cudaconvnet不太熟悉,因为我主要与Torch合作,但我经常遇到与人为增强数据相同的情况。

你最好的选择是(c),那种。

对我来说,增加数据的最佳位置是正确的,当一个样本被教练的内部循环加载时 - 应用随机失真,翻转,裁剪(或者其他扩展你的样本)瞬间并到单个数据样本。这将实现的是,每当训练员尝试加载样本时,它实际上都会收到一个修改后的版本,它可能会与之前迭代中看到的任何其他图像不同。

然后,当然,你需要到别的调整的东西仍然得到了1000倍的数据大小的因素在这两种:

  1. 理想的情况下,每时期负荷更批次内循环后,处理完第一组。如果你的扩展器设置正确,每批都会继续得到随机样本,这样它们都能很好地工作。火炬允许这样做,但它有点棘手,我不确定你是否能够在cudaconvnet中做同样的事情。
  2. 否则,只需运行培训师1000多个训练时期即可。不够优雅,但最终结果将是一样的。如果您以后需要报告您受过训练的时代数量,只需将实际数量除以1000即可根据您的1000倍增强数据集获得更合适的估计值。

这样,您将始终将您的目标类作为您的原始数据随机分布在整个数据集中,而不会消耗任何额外的磁盘空间来缓存增强样本。当然,这是以额外的计算能力为代价的,因为您会一直沿着路径的每一步按需生成样本,但您已经知道...

此外,也许更重要的是,您的批次将保持原来的128个大小,因此小批量过程将保持不变,您学习的参数更新将继续以您期望的相同频率下降。对于SGD培训(批量大小= 1),同样的过程也很有效,因为培训师将永远不会看到“相同”的图像两次。

希望有所帮助。

+0

这是否意味着你的模型永远不会看到实际的地面真相图像,但始终是图像的修改版本? – Demonedge

+0

@Demonedge你的一个随机增强可能无能为力。 – Alex