Alp*_*mez 6 python shuffle training-data neural-network pytorch
我做了一个实验,但没有得到我期望的结果。
对于第一部分,我使用
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128,
shuffle=False, num_workers=0)
Run Code Online (Sandbox Code Playgroud)
我保存trainloader.dataset.targets到变量a,并在训练模型之前trainloader.dataset.data保存到变量。b然后,我使用 训练模型trainloader。
训练完成后,我保存trainloader.dataset.targets到变量c和trainloader.dataset.data变量d。最后,我检查a == c和b == d,它们都给出True,这是预期的,因为 的 shuffle 参数DataLoader是False。
对于第二部分,我正在使用
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128,
shuffle=True, num_workers=0)
Run Code Online (Sandbox Code Playgroud)
我保存trainloader.dataset.targets到变量e,并在训练模型之前trainloader.dataset.data保存到变量。f然后,我使用 训练模型trainloader。训练完成后,我保存trainloader.dataset.targets到变量g和trainloader.dataset.data变量h。我期望e == g和从那时f == h起两者都是,但他们再次给予。我从类的定义中遗漏了什么?Falseshuffle=TrueTrueDataLoader
我相信直接存储在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)
Run Code Online (Sandbox Code Playgroud)
这将给出:
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])
Run Code Online (Sandbox Code Playgroud)
然而,存储在 data 和 target 中的数据和标签是一个固定列表,并且由于您尝试直接访问它,因此它们不会被打乱。