我有两个并行数据集dataset1
和dataset2
,下面是我使用SubsetRandomSampler
并行加载它们的代码,其中我提供train_indices
用于数据加载。
P.S.即使在设置num_workers=0
并播种np
和torch
之后,示例也不会并行加载。衷心欢迎您提出任何建议,包括SubsetRandomSampler
以外的方法。
import torch, numpy as np
from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler
dataset1 = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
dataset2 = torch.tensor([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
train_indices = list(range(len(dataset1)))
torch.manual_seed(12)
np.random.seed(12)
np.random.shuffle(train_indices)
sampler = SubsetRandomSampler(train_indices)
dataloader1 = DataLoader(dataset1, batch_size=2, num_workers=0, sampler=sampler)
dataloader2 = DataLoader(dataset2, batch_size=2, num_workers=0, sampler=sampler)
for i, (data1, data2) in enumerate(zip(dataloader1, dataloader2)):
x = data1
y = data2
print(x, y)
输出量:
tensor([5, 1]) tensor([15, 18])
tensor([0, 2]) tensor([14, 12])
tensor([4, 6]) tensor([16, 10])
tensor([8, 9]) tensor([11, 19])
tensor([7, 3]) tensor([17, 13])
预期输出:
tensor([5, 1]) tensor([15, 11])
tensor([0, 2]) tensor([10, 12])
tensor([4, 6]) tensor([14, 16])
tensor([8, 9]) tensor([18, 19])
tensor([7, 3]) tensor([17, 13])
1条答案
按热度按时间sg24os4d1#
看起来您正在尝试并行加载两个数据集,但让它们保持相同的打乱顺序。
目前,代码对
dataset1
的索引进行混洗,然后使用这些混洗后的索引对dataset1
和dataset2
进行采样。但是,这并不能保证相同的元素在输出中配对在一起,因为dataset2
是与dataset1
分开混洗的。为了达到预期的输出,您需要将两个数据集混洗在一起,然后使用混洗索引从两个数据集进行采样。一种方法是首先将两个数据集合并为一个数据集,该数据集包含每个数据集对应元素的元组,然后对合并后的数据集进行混洗。然后,您可以使用混洗索引创建两个单独的数据加载器。每个函数将返回来自每个数据集的相应元素。
下面是一个如何实现这一点的示例: