用卷积神经网络实现图像分类的数据增强

时间:2014-02-26 18:34:47

标签: image-processing neural-network

我正在使用cudaconvnet与Daniel Nouri的noccn模块进行图像分类,并希望通过拍摄原始图像的大量补丁(并翻转它)来实现数据增强。什么时候才能最好的发生呢?

我在训练过程中确定了3个阶段: a)从数据创建批次时 b)获得下一批培训时 c)给出批次,当获取下一张图像进入网络时

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

b)和c)不涉及将新数据存储在磁盘上,但是我可以将数据分散到批次中吗?如果我不这样做,那么假设我有batch_size == 128并且我可以增加我的数据1000x,那么接下来的8个批次将包含来自同一类的图像。训练网是不是很糟糕,因为每个训练样本根本不会被随机化?

此外,如果我选择b)或c)并从k个训练样例中创建一个新批次,那么数据增加n次将使批量大小为n * k而不是给我n次批次。

例如,在我的情况下,我有batchsize == 128并且可以预期1000x数据扩充。因此,每个批次实际上将是128 * 1000的大小,并且我将获得更准确的偏导数估计(并且无用程度,因为batchsize == 128k是毫无意义的高)。

那我该怎么办?

1 个答案:

答案 0 :(得分:6)

是的,您希望增加的样本尽可能随机散布在其余数据中。否则,你肯定会遇到问题,因为批次不会被正确采样,你的梯度下降步骤会有太大的偏差。我对cudaconvnet并不太熟悉,因为我主要与Torch合作,但我经常遇到与人工增强数据相同的情况。

你最好的选择是(c),有点。

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

然后,当然,您需要调整其他内容才能获得1000x数据大小因子。或者:

  1. 理想情况下,在内循环处理完第一组后,每个纪元加载更多批次。如果您的增强器设置正确,每个批次将继续获取随机样本,以便它们都能正常运行。火炬允许这样做,但它有点棘手,我不确定你是否能够在cudaconvnet中做同样的事情。
  2. 否则,只需运行训练师1000个以上的训练时期。不那么优雅,但最终结果将是一样的。如果您以后需要报告您实际训练过的时期数,请简单地将实际计数除以1000,以便根据您的1000x增强数据集获得更合适的估计值。
  3. 这样,您将始终将目标类随机分布在整个数据集中,就像原始数据一样,而不会消耗任何额外的磁盘空间来缓存扩充样本。当然,这是以额外的计算能力为代价的,因为您将在整个过程中的每一步按需生成样本,但您已经知道......

    此外,也许更重要的是,您的批次将保持原始的128尺寸,因此迷你批处理过程将保持不变,您学习的参数更新将继续以您预期的相同频率下降。同样的过程也适用于SGD培训(批量大小= 1),因为培训师永远不会看到两次“相同”的图像。

    希望有所帮助。