- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对pytorch中DataLoader的shuffle order真的是一头雾水。假设我有一个数据集:
datasets = [0,1,2,3,4]
场景一,代码为:
torch.manual_seed(1)
G = torch.Generator()
G.manual_seed(1)
ran_sampler = RandomSampler(data_source=datasets,generator=G)
dataloader = DataLoader(dataset=datasets,sampler=ran_sampler)
洗牌结果为0,4,2,3,1
。
场景二,代码为:
torch.manual_seed(1)
G = torch.Generator()
G.manual_seed(1)
ran_sampler = RandomSampler(data_source=datasets)
dataloader = DataLoader(dataset=datasets, sampler=ran_sampler, generator=G)
洗牌结果为1,3,4,0,2
。
场景三,代码为:
torch.manual_seed(1)
G = torch.Generator()
G.manual_seed(1)
ran_sampler = RandomSampler(data_source=datasets, generator=G)
dataloader = DataLoader(dataset=datasets, sampler=ran_sampler, generator=G)
洗牌结果为4,1,3,0,2
。
谁能解释一下这是怎么回事?
最佳答案
根据你的代码,我做了一点修改(在场景二)和检查:
datasets = [0,1,2,3,4]
torch.manual_seed(1)
G = torch.Generator()
G = G.manual_seed(1)
ran_sampler = RandomSampler(data_source=datasets, generator=G)
dataloader = DataLoader(dataset=datasets, sampler=ran_sampler)
print(id(dataloader.generator)==id(dataloader.sampler.generator))
xs = []
for x in dataloader:
xs.append(x.item())
print(xs)
torch.manual_seed(1)
G = torch.Generator()
G.manual_seed(1)
# this is different from OP's scenario II because in that case the ran_sampler is not initialized with the right generator.
dataloader = DataLoader(dataset=datasets, shuffle=True, generator=G)
print(id(dataloader.generator)==id(dataloader.sampler.generator))
xs = []
for x in dataloader:
xs.append(x.item())
print(xs)
torch.manual_seed(1)
G = torch.Generator()
G.manual_seed(1)
ran_sampler = RandomSampler(data_source=datasets, generator=G)
dataloader = DataLoader(dataset=datasets, sampler=ran_sampler, generator=G)
print(id(dataloader.generator)==id(dataloader.sampler.generator))
xs = []
for x in dataloader:
xs.append(x.item())
print(xs)
输出是:
False
[0, 4, 2, 3, 1]
True
[4, 1, 3, 0, 2]
True
[4, 1, 3, 0, 2]
之所以上面三种看似等价的设置导致不同的结果,是因为DataLoader
内部实际使用了两种不同的生成器,其中一种是None
,在第一种情况下。
为了说清楚,我们来分析下出处。看来generator
不仅决定了DataLoader
内部_index_sampler
的随机数生成,还影响了_BaseDataLoaderIter
。查看源码
if sampler is None: # give default samplers
if self._dataset_kind == _DatasetKind.Iterable:
# See NOTE [ Custom Samplers and IterableDataset ]
sampler = _InfiniteConstantSampler()
else: # map-style
if shuffle:
sampler = RandomSampler(dataset, generator=generator) # type: ignore[arg-type]
else:
sampler = SequentialSampler(dataset) # type: ignore[arg-type]
和
self.sampler = sampler
self.batch_sampler = batch_sampler
self.generator = generator
和
def _get_iterator(self) -> '_BaseDataLoaderIter':
if self.num_workers == 0:
return _SingleProcessDataLoaderIter(self)
else:
self.check_worker_number_rationality()
return _MultiProcessingDataLoaderIter(self)
和
class _BaseDataLoaderIter(object):
def __init__(self, loader: DataLoader) -> None:
...
self._index_sampler = loader._index_sampler
- 场景二和场景三
两种设置是等价的。我们将生成器传递给 DataLoader
并且不指定 sampler
。 DataLoader
使用 generator
自动创建一个 RandomSampler
对象,并将相同的生成器分配给 self.generator
。
- 情景一
我们使用正确的生成器将采样器传递给
。 DataLoader
,但没有在 DataLoader.__init__(...)
generator
DataLoader
使用给定的采样器初始化采样器,但为 self.generator
和 _BaseDataLoaderIter
对象使用默认生成器 None
由 self._get_iterator()
返回。
关于python - pytorch中DataLoader的洗牌顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74580942/
我目前遇到以下情况,我想使用 DataLoader 批处理 numpy 数组: import numpy as np import torch import torch.utils.data as d
我现在正在使用 Pytorch 运行 Python 程序。我使用我自己的数据集,而不是 torch.data.dataset .我从从特征提取中提取的泡菜文件下载数据。但是出现以下错误: Traceb
问题 我有以下问题: 我想使用 pytorchs DataLoader(以类似于 here 的方式)但我的设置有点不同: 在我的数据文件夹中,我有不同街道情况的图像(让我们称它们为 image_tot
我已经通过这个 pytorch api 通过设置 download=True 下载了 ImageNet 数据集。但我无法遍历数据加载器。 错误说“'DataLoader' 对象不支持索引” train
我了解 dataLoader 如何使用简单的键工作: import DataLoader from 'dataloader'; import myService from './services/se
当遍历 PyTorch 数据加载器时,例如 # define dataset, dataloader train_data = datasets.ImageFolder(data_dir + '/tr
当遍历 PyTorch 数据加载器时,例如 # define dataset, dataloader train_data = datasets.ImageFolder(data_dir + '/tr
我正在使用 graphql 和 mongodb (mongoose) 构建一个快速 JS 应用程序。我正在使用 facebooks Dataloader 来批处理和缓存请求。 除了这个用例,它工作得很
查看 DataLoader library ,它是如何缓存和批处理请求的? 指令以下列方式指定用法: var DataLoader = require('dataloader') var userLo
shuffle = False时,不打乱数据顺序 shuffle = True,随机打乱 ?
关于Pytorch中怎么自定义Dataset数据集类、怎样使用DataLoader迭代加载数据,这篇官方文档已经说得很清楚了,这里就不在赘述。 现在的问题:有的时候,特别对于NLP任务来说,输入的
最近在学pytorch,在使用数据分批训练时在导入数据是使用了 DataLoader 在参数 num_workers的设置上使程序出现运行没有任何响应的结果 ,看看代码
有一个bug在 PyTorch/Numpy 中,当使用 DataLoader 并行加载批处理时(即设置 num_workers > 1),每个 worker 使用相同的 NumPy 随机种子,导致任何
我有以下错误。 Expected: /home/ubuntu/.pycharm_helpers/pydev/pydevd_attach_to_process/attach_linux_amd64.so
有一个bug在 PyTorch/Numpy 中,当与 DataLoader 并行加载批次时(即设置 num_workers > 1 ),每个 worker 使用相同的 NumPy 随机种子,导致应用的
我有一个 GraphQL api,使用传统的解析函数可以很好地工作。我的目标是消除 N+1 问题。 为此,我决定使用 Dataloader。我已经完成了这些步骤,据说可以让应用程序运行: 我将这两个函
当我创建一个 PyTorch DataLoader 并开始迭代时——我得到了一个非常慢的第一个纪元(x10--x30 比所有下一个纪元都慢)。此外,此问题仅出现在来自 Kaggle 的 Google
我有非常常见的 GraphQL 架构,如下所示(伪代码): Post { commentsPage(skip: Int, limit: Int) { total: Int item
有没有办法将DataLoader作为列表处理?我的想法是,我想对隐式图像对进行洗牌,而不将洗牌设置为 True 基本上,我有 10 个场景,每个场景包含 100 个序列,因此它们在目录中表示为 '1_
我需要用我训练的卷积神经网络的数据测试结果编写一个文件。数据包括语音数据采集。文件格式需要是“文件名,预测”,但我很难提取文件名。我这样加载数据: import torchvision from to
我是一名优秀的程序员,十分优秀!