每个时期如何进行数据扩充?

How is data augmentation done in each epoch?

我是 PyTorch 的新手,想对每个时期的数据集应用数据增强。我

train_transform = Compose([
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize([0, 0, 0], [1, 1, 1])
])

test_transform = Compose([
    transforms.ToTensor(),
    transforms.Normalize([0, 0, 0], [1, 1, 1])
])

cifar10_train = CIFAR10(root = "/data", train=True, download = True, transform=train_transform)
train_loader = torch.utils.data.DataLoader(cifar10_train, batch_size=128, shuffle=True)

cifar10_test = CIFAR10(root = "/data", train=False, download = True, transform=test_transform)
test_loader = torch.utils.data.DataLoader(cifar10_test, batch_size=128, shuffle=True)

我从在线教程中获得了代码。因此,据我了解,train_transform 和 test_transform 是扩充代码,而 cifar10_train 和 cifar10_test 是加载数据和同时完成扩充的地方。这是否意味着数据扩充只在训练前进行一次?如果我想为每个 epoch 做数据扩充怎么办?

以下是粗略的操作流程:

  1. 从文件系统中读取 128 个示例。
  2. 对它们进行批处理(即制作一批示例)并对批处理应用转换。
  3. 将批次传递到网络。

因此,在将每个批次输入模型之前,将转换应用于每个批次,而不考虑时代。

我认为你的代码有一些误解。 cifar10_traincifar10_test 实际上将数据集加载到 python 中(此数据未扩充并且是原始数据),然后数据经过转换。在大多数情况下,训练集是完成数据扩充的地方,而测试集没有扩充,因为它应该复制真实世界的数据。转换(train_transformtest_transforms)决定了数据如何扩充、归一化和转换为 PyTorch 张量,您可以将其视为数据集的一组 guidelines/rules跟随。如前所述,训练集只得到扩充,这就是为什么 train_transform 有 RandomHorizontalFlipRandomCrop(进行扩充),以及为什么 test_transforms 没有 RandomHorizontalFlipRandomCrop。加载程序(train_loadertest_loader)将数据分成批次(数据组),并将转换应用于 cifar10 数据集。