python-3.x - 如何通过数据增强来增加图像数量

标签 python-3.x pytorch data-augmentation

我正在尝试使用 pytorch 应用数据增强。特别是,我有一个包含 150 张图像的数据集,我想对每个图像应用 5 次变换(水平翻转、3 次随机旋转和垂直翻转)以拥有 750 张图像,但使用我的代码我总是有 150 张图像。

'train': transforms.Compose([
    transforms.Resize(224),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(degrees = (90,90)),
    transforms.RandomRotation(degrees = (180,180)),
    transforms.RandomRotation(degrees = (270,270)),
    transforms.RandomVerticalFlip(p=1),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

最佳答案

您误解了 API。当您向数据集添加一些转换时,它本质上是一个函数,该函数被应用于该数据集中的每个样本,然后返回。 transforms.Compose 按顺序应用子转换,而不是返回多个结果(每个翻译要么应用,要么不应用)。所以

transforms.Compose([
    transforms.RandomRotation(degrees = (90, -90)),
    transforms.RandomRotation(degrees = (180, -180)),
])

只会以 90 到 90 度之间的随机角度(换句话说,正好 90 度)旋转图像一次,然后再旋转 180。这相当于单个 RandomRotation( Degrees=(270, 270))(实际上更糟糕,因为它会导致过程中更多的数据损坏)。

因此,大多数变换如上所述 - “线性” - 一个输入,一个输出。有一些“ fork ”变换会产生比输入更多的输出。一个例子是 FiveCrop 。请注意其有关如何处理的注释。即使使用“ fork ”转换,您仍然会在数据集中获得相同数量的项目,只是您的批处理会更大。

如果您特别想要一个数据集,其中包含每个项目的 4 个不同旋转副本并随机生成它们(即每个旋转变体可能来自不同的批处理),您将必须编写一些自定义数据加载逻辑。为此,您可能希望将您的工作基于 DatasetFolder 的来源。 .

为什么 API 是这样的?在实践中,大多数人都对当前的变换感到满意 - 在你的位置,他们只会编写一个随机翻转 0、90、180 或 270 度的变换,然后训练他们的网络比你多 4 倍的训练周期,平均每个得到一个样本。

关于python-3.x - 如何通过数据增强来增加图像数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235136/

相关文章:

python - 使用 arr copy() 函数时得到错误答案

gpu - 如何在 Pytorch 中修复 "RuntimeError: CUDA error: device-side assert triggered"

python - 如何使用增强来设置训练,同时确保未增强的实际图像也得到训练?

pytorch - Resize Vs CenterCrop Vs RandomResizedCrop Vs RandomCrop

python - 我的背包代码输出错误?

python - Travis CI 在 macOS 上找不到 python3

python-3.x - 如何使用逻辑运算符从具有 categoricalDtype 的列中选择 pandas 数据框中的行

python - Pytorch:我们可以直接在 forward() 函数中使用 nn.Module 层吗?

gpu - 将功能元素逐个应用于Pytorch CUDA张量的并行方式

image - 在图像文本文档中随机生成合成噪声