gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:08:25 24 4
gpt4 key购买 nike

我正在使用带有 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 太高了)。

所以我该怎么做?

最佳答案

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

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

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

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

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

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

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

    希望有帮助。

    关于image-processing - 使用卷积神经网络实现图像分类的数据增强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050186/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com