【问题标题】:Implementation of Data Augmentation for Image Classification with Convolutional Neural Networks使用卷积神经网络实现图像分类的数据增强
【发布时间】:2014-03-29 19:12:36
【问题描述】:

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

我已经确定了培训过程中可能的三个阶段:
a) 从数据创建批次时
b) 下一批训练时
c) 给定一个批次,当获取下一张图片输入网络时

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

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

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

例如,在我的情况下,我的 batchsize==128 并且可以预期 1000 倍的数据增强。因此,每个批次实际上的大小为 128*1000,而我将得到的只是更准确的偏导数估计(这在无用的程度上是无用的,因为 batchsize==128k 太高了)。

那我该怎么办?

【问题讨论】:

    标签: image-processing neural-network


    【解决方案1】:

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

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

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

    然后,当然,您将需要调整其他东西以仍然获得 1000 倍的数据大小因子。要么:

    1. 理想情况下,在内循环完成第一组处理后,每个 epoch 加载更多批次。如果您的增强器设置正确,则每批都将继续获得随机样本,因此一切都会顺利进行。 Torch 允许这样做,但它有点棘手,我不确定你是否能够在 cudaconvnet 中做同样的事情。
    2. 否则,只需将训练器运行 1000 多个训练 epoch。不那么优雅,但最终结果将是相同的。如果您稍后需要报告您实际训练的 epoch 数,只需将实际计数除以 1000 即可根据您的 1000 倍增强数据集获得更合适的估计。

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

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

    希望对您有所帮助。

    【讨论】:

    • 这是否意味着您的模型永远不会看到实际的地面实况图像,而总是看到图像的修改版本?
    • @Demonedge 你的随机增强之一可能什么都不做。
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2017-02-12
    • 1970-01-01
    • 2016-10-03
    • 2017-03-21
    • 1970-01-01
    • 2019-05-31
    • 2017-08-06
    相关资源
    最近更新 更多