我正在使用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是毫无意义的高)。
那我该怎么办?
答案 0 :(得分:6)
是的,您希望增加的样本尽可能随机散布在其余数据中。否则,你肯定会遇到问题,因为批次不会被正确采样,你的梯度下降步骤会有太大的偏差。我对cudaconvnet并不太熟悉,因为我主要与Torch合作,但我经常遇到与人工增强数据相同的情况。
你最好的选择是(c),有点。
对我来说,增加数据的最佳位置是当你的训练师的内环加载样本时 - 在那一刻应用随机失真,翻转,裁剪(或者你正在增加你的样本)以及单个数据样本。这将实现的是,每次教练尝试加载样本时,它实际上会收到修改后的版本,该版本可能与之前迭代中看到的任何其他图像不同。
然后,当然,您需要调整其他内容才能获得1000x数据大小因子。或者:
这样,您将始终将目标类随机分布在整个数据集中,就像原始数据一样,而不会消耗任何额外的磁盘空间来缓存扩充样本。当然,这是以额外的计算能力为代价的,因为您将在整个过程中的每一步按需生成样本,但您已经知道......
此外,也许更重要的是,您的批次将保持原始的128尺寸,因此迷你批处理过程将保持不变,您学习的参数更新将继续以您预期的相同频率下降。同样的过程也适用于SGD培训(批量大小= 1),因为培训师永远不会看到两次“相同”的图像。
希望有所帮助。