python - PyTorch DataLoader 随机播放
问题描述
我做了一个实验,并没有得到我期望的结果。
对于第一部分,我正在使用
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 == c
andb == d
他们都给了True
,这是意料之中的,因为 shuffle 的参数DataLoader
是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 == 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 和 target 中的数据和标签是一个固定列表,由于您尝试直接访问它,它们不会被打乱。
推荐阅读
- typescript - 类型“typeof ...”上不存在属性“use”,类型“typeof”上不存在属性“extend”
- tableau-api - % 在参数控制中增加基于计算的值?
- javascript - 如何减少将 useState 用于模态的次数?
- python - 系列是什么意思[系列]
- kubernetes - 3 个副本可以在 Kubernetes 的 StatefulSet 中使用相同的 PersistentVolume 吗?
- javascript - 使用javascript加载页面时自动将跨度文本复制到输入字段
- javascript - Discord bot 不会读取用户的表情
- typescript - 在 TypeScript 中,如果方法可以更改该类型,如何指定方法链接结果类型?
- swift - 栏项中的导航链接返回到 NavigationView 的顶部
- git - 使用 VS Code 初始化 git 存储库时出现问题