首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyTorch中的数据增强

PyTorch中的数据增强
EN

Stack Overflow用户
提问于 2018-08-03 17:51:49
回答 6查看 75.6K关注 0票数 81

我对在PyTorch中执行的数据增强感到有点困惑。现在,据我所知,当我们执行数据增强时,我们保留原始数据集,然后添加其他版本的数据集(翻转,Cropping...etc)。但这似乎不像发生在PyTorch。据我从参考资料中了解到,当我们在data.transforms中使用PyTorch时,它会逐一应用它们。例如:

代码语言:javascript
复制
data_transforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

在这里,为了训练,我们首先随机剪切图像并调整大小以形成(224,224)。然后我们拍摄这些(224,224)图像并水平翻转它们。因此,我们的数据集现在只包含水平翻转的图像,因此我们的原始图像在这种情况下丢失了。

我说的对吗?这种理解是正确的吗?如果没有,那么我们在上面的代码中告诉PyTorch (从官方文档中摘录)以保留原始图像并将它们调整为预期的形状(224,224)

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-08-03 18:19:53

transforms操作在每次批处理生成时都应用于原始映像。因此,数据集将保持不变,只有批处理图像在每次迭代时都被复制和转换。

混淆可能来自这样一个事实,就像在您的示例中一样,transforms通常用于数据准备(调整大小/裁剪到预期尺寸、规范化值等)。以及数据增强(随机调整大小/裁剪,随机翻转图像等)。

您的data_transforms['train']所做的是:

  • 随机调整提供的图像大小并随机裁剪以获得(224, 224)修补程序
  • 对此修补程序应用或不随机水平翻转,有50/50的可能性
  • 将其转换为Tensor
  • 给定所提供的均值和偏差值,使结果Tensor规范化

您的data_transforms['val']所做的是:

  • 将图像大小调整为(256, 256)
  • 中心裁剪调整大小的图像以获得(224, 224)修补程序
  • 将其转换为Tensor
  • 给定所提供的均值和偏差值,使结果Tensor规范化

(即将训练数据的随机调整大小/剪切替换为验证数据的固定操作,以获得可靠的验证结果)

如果你不希望你的训练图像水平翻转50/50的机会,只需删除transforms.RandomHorizontalFlip()行。

类似地,如果您希望您的图像始终以中心方式裁剪,请将transforms.RandomResizedCrop替换为transforms.Resizetransforms.CenterCrop,就像对data_transforms['val']那样。

票数 54
EN

Stack Overflow用户

发布于 2019-01-31 12:07:57

我假设您是在问这些数据增强转换(例如RandomHorizontalFlip)是否实际上也增加了dataset的大小,或者是一个接一个地应用于数据集中的每个项,而不是添加到dataset的大小。

运行以下简单的代码片段,我们可以看到是真,也就是说,如果您有一个包含8个图像的数据集,并且在遍历数据集时为该数据集创建一个PyTorch dataset对象,则在每个数据点上调用转换,并返回转换后的数据点。因此,例如,如果有随机翻转,一些数据点作为原始数据返回,一些数据点作为翻转返回(例如4个翻转和4个原始数据)。换句话说,通过对dataset项进行一次迭代,您就可以得到8个数据点(有些翻转了,有些没有)。这与增强数据集的传统理解不一致(例如,在这种情况下,增强数据集中有16个数据点)。

代码语言:javascript
复制
class experimental_dataset(Dataset):

    def __init__(self, data, transform):
        self.data = data
        self.transform = transform

    def __len__(self):
        return len(self.data.shape[0])

    def __getitem__(self, idx):
        item = self.data[idx]
        item = self.transform(item)
        return item

    transform = transforms.Compose([
        transforms.ToPILImage(),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor()
    ])

x = torch.rand(8, 1, 2, 2)
print(x)

dataset = experimental_dataset(x,transform)

for item in dataset:
    print(item)

结果:(浮点数的细微差异是由于将浮点数转换为pil图像和背面)。

原始虚拟数据集:

代码语言:javascript
复制
tensor([[[[0.1872, 0.5518],
          [0.5733, 0.6593]]],


    [[[0.6570, 0.6487],
      [0.4415, 0.5883]]],


    [[[0.5682, 0.3294],
      [0.9346, 0.1243]]],


    [[[0.1829, 0.5607],
      [0.3661, 0.6277]]],


    [[[0.1201, 0.1574],
      [0.4224, 0.6146]]],


    [[[0.9301, 0.3369],
      [0.9210, 0.9616]]],


    [[[0.8567, 0.2297],
      [0.1789, 0.8954]]],


    [[[0.0068, 0.8932],
      [0.9971, 0.3548]]]])

转换数据集:

代码语言:javascript
复制
tensor([[[0.1843, 0.5490],
     [0.5725, 0.6588]]])
tensor([[[0.6549, 0.6471],
     [0.4392, 0.5882]]])
tensor([[[0.5647, 0.3255],
         [0.9333, 0.1216]]])
tensor([[[0.5569, 0.1804],
         [0.6275, 0.3647]]])
tensor([[[0.1569, 0.1176],
         [0.6118, 0.4196]]])
tensor([[[0.9294, 0.3333],
         [0.9176, 0.9608]]])
tensor([[[0.8549, 0.2275],
         [0.1765, 0.8941]]])
tensor([[[0.8902, 0.0039],
         [0.3529, 0.9961]]])
票数 84
EN

Stack Overflow用户

发布于 2020-09-11 18:20:38

是的,数据集大小在转换后不会更改。每个图像都被传递给转换并返回,因此大小保持不变。

如果希望使用具有转换后的数据集的原始数据集,请将它们连接起来。

例如increased_dataset = torch.utils.data.ConcatDataset([transformed_dataset,original])

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51677788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档