Python PyTorch数据加载程序洗牌

Python PyTorch数据加载程序洗牌,python,neural-network,pytorch,shuffle,training-data,Python,Neural Network,Pytorch,Shuffle,Training Data,我做了一个实验,但没有得到我期望的结果 对于第一部分,我使用 trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=False, num_workers=0) trainloader = torch.utils.data.DataLoader(trainset, batch_size=128,

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

对于第一部分,我使用

trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, 
                                          shuffle=False, num_workers=0)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, 
                                          shuffle=True, num_workers=0)
在训练模型之前,我将
trainloader.dataset.targets
保存到变量
a
,将
trainloader.dataset.data
保存到变量
b
。然后,我使用
trainloader
对模型进行训练
培训结束后,我将
trainloader.dataset.targets
保存到变量
c
,将
trainloader.dataset.data
保存到变量
d
。最后,我检查
a==c
b==d
,它们都给出
True
,这是预期的,因为
DataLoader
的shuffle参数是
False

对于第二部分,我使用

trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, 
                                          shuffle=False, num_workers=0)
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==g
f==h
都是
False
,因为
shuffle=True
,但它们再次给出
True
DataLoader
类的定义中缺少了什么?

我相信直接存储在trainloader.dataset.data或.target中的数据不会被洗牌,只有当DataLoader被称为生成器或迭代器时,数据才会被洗牌

您可以通过执行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])

但是,存储在data and target中的数据和标签是一个固定列表,由于您试图直接访问它,因此不会对其进行无序化。

我相信直接存储在trainloader.dataset.data或.target中的数据不会被无序化,只有当DataLoader被称为生成器或迭代器时,数据才会被洗牌

您可以通过执行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])

但是,存储在data and target中的数据和标签是一个固定列表,因为您试图直接访问它,所以它们不会被洗牌。

在使用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数组。

在使用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数组