【问题标题】:PyTorch DataLoader shufflePyTorch DataLoader 随机播放
【发布时间】:2020-04-09 06:17:04
【问题描述】:

我做了一个实验,但没有得到我期望的结果。

对于第一部分,我使用的是

trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, 
                                          shuffle=False, num_workers=0)

在训练我的模型之前,我将trainloader.dataset.targets 保存到变量a,并将trainloader.dataset.data 保存到变量b。然后,我使用trainloader 训练模型。
训练完成后,我将trainloader.dataset.targets保存到变量c,将trainloader.dataset.data保存到变量d。最后,我检查了a == cb == d,它们都给出了True,这是意料之中的,因为DataLoader 的shuffle 参数是False

对于第二部分,我正在使用

trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, 
                                          shuffle=True, num_workers=0)

在训练我的模型之前,我将trainloader.dataset.targets 保存到变量e,并将trainloader.dataset.data 保存到变量f。然后,我使用trainloader 训练模型。训练完成后,我将trainloader.dataset.targets保存到变量g,将trainloader.dataset.data保存到变量h。我希望e == gf == h 都是False,因为shuffle=True,但他们又给了True。我在DataLoader 类的定义中遗漏了什么?

【问题讨论】:

    标签: python neural-network pytorch shuffle training-data


    【解决方案1】:

    我相信直接存储在trainloader.dataset.data或.target中的数据不会被shuffle,数据只有在DataLoader被称为generator或者iterator的时候才会shuffle

    您可以通过执行几次 next(iter(trainloader)) 来检查它,而不用改组和改组,它们应该会给出不同的结果

    import torch
    import torchvision
    
    transform = torchvision.transforms.Compose([
            torchvision.transforms.ToTensor(),
            ])
    MNIST_dataset = torchvision.datasets.MNIST('~/Desktop/intern/',download = True, train = False,
                                               transform = transform)
    dataLoader = torch.utils.data.DataLoader(MNIST_dataset,
                                             batch_size = 128,
                                             shuffle = False,
                                             num_workers = 10)
    target = dataLoader.dataset.targets
    
    
    MNIST_dataset = torchvision.datasets.MNIST('~/Desktop/intern/',download = True, train = False,
                                               transform = transform)
    
    dataLoader_shuffled= torch.utils.data.DataLoader(MNIST_dataset,
                                             batch_size = 128,
                                             shuffle = True,
                                             num_workers = 10)
    
    target_shuffled = dataLoader_shuffled.dataset.targets
    
    print(target == target_shuffled)
    
    _, target = next(iter(dataLoader));
    _, target_shuffled = next(iter(dataLoader_shuffled))
    
    print(target == target_shuffled)
    

    这将给出:

    tensor([True, True, True,  ..., True, True, True])
    tensor([False, False, False, False, False, False, False, False, False, False,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False, False, False, False, False, False,  True,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False,  True, False, False, False, False, False,
            False,  True, False, False, False, False, False, False, False, False,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False,  True,  True, False, False, False, False,
            False, False, False, False, False, False, False, False, False, False,
            False, False, False, False, False,  True, False, False,  True, False,
            False, False, False, False, False, False, False, False])
    

    但是数据和目标中存储的数据和标签是一个固定的列表,并且由于您尝试直接访问它,因此它们不会被打乱。

    【讨论】:

      【解决方案2】:

      我在使用 Dataset 类加载数据时遇到了类似的问题。我停止使用 Dataset 类加载数据,而是使用以下代码,这对我来说很好

      X = torch.from_numpy(X)
      y = torch.from_numpy(y)
      
      train_data = torch.utils.data.TensorDataset(X, y)
      train_loader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)
      

      其中 X & y 是 csv 文件中的 numpy 数组。

      【讨论】:

        猜你喜欢
        • 2018-10-11
        • 2019-05-03
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多