我正在尝试运行我的数据的玩具示例。我的最终目标是让数据加载器的每个批次对输出的每个样本都有不同的编号,但我得到的值是相同的,尽管调用了随机整数调用,并打乱了我的数据加载器数据我的pytorch数据集实现如下:
class RandomDataset(Dataset):
def __init__(self):
self.array1 = np.random.randint(0,100,20)
self.array2 = np.random.randint(0,100,20)
self.array3 = np.random.randint(0,100,20)
self.array4 = np.random.randint(0,100,20)
def __len__(self):
#all arrays are same length
return len(self.array1)
def __getitem__(self, idx):
first = self.array1[idx]
sample1 = torch.Tensor(self.array1)
sample2 = torch.Tensor(self.array2)
sample3 = torch.Tensor(self.array3)
sample4 = torch.Tensor(self.array4)
return sample1, sample2, sample3, sample4
我把数据加载器称为
x = RandomDataset()
DL = DataLoader(x, batch_size=3, shuffle= True)
当我运行时,这些值都是一样的
iterator = iter(DL)
output = next(iterator)
output
>>>[tensor([[21., 80., 46., 58., 2., 21., 10., 44., 65., 79., 87., 10., 45., 3.,
0., 11., 29., 76., 55., 25.],
[21., 80., 46., 58., 2., 21., 10., 44., 65., 79., 87., 10., 45., 3.,
0., 11., 29., 76., 55., 25.],
[21., 80., 46., 58., 2., 21., 10., 44., 65., 79., 87., 10., 45., 3.,
0., 11., 29., 76., 55., 25.]]),
我想每次我得到一批数据时,它都会运行我的数据集,我就会得到一个由20个数字组成的新数组。我错过了什么?
您总是为数据集的每个实例返回self.array1
到self.array4
,您还期望什么?你假设这些张量在每次通话时都会被重新采样?否,因为它们已在__init__
中初始化。考虑到你有first = self.array1[idx]
的事实,我认为你的意思是索引__getitem__
函数中的所有四个张量。
因此,这里有一个例子,我认为这就是你试图做的:
class RandomDataset(data.Dataset):
def __init__(self):
self.array1 = torch.randint(0,100,(20,))
self.array2 = torch.randint(0,100,(20,))
self.array3 = torch.randint(0,100,(20,))
self.array4 = torch.randint(0,100,(20,))
def __len__(self):
return len(self.array1)
def __getitem__(self, idx):
return self.array1[idx], self.array2[idx], self.array3[idx], self.array4[idx]
由于这个用例受到了很大的限制,您可以使用TensorDataset
:
class RandomDataset(data.TensorDataset):
def __init__(self):
r = lambda : torch.randint(0,100,(20,))
super().__init__(r(), r(), r(), r())