gpt4 book ai didi

python - Pytorch 的数据加载器 shuffle 何时发生?

转载 作者:行者123 更新时间:2023-12-03 20:07:00 26 4
gpt4 key购买 nike

我已经多次使用 pytorch 数据加载器的 shuffle 选项。但我想知道这种 shuffle 何时发生以及它是否在迭代期间动态执行。以下面的代码为例:

namesDataset = NamesDataset()
namesTrainLoader = DataLoader(namesDataset, batch_size=16, shuffle=True)
for batch_data in namesTrainLoader:
print(batch_data)

当我们定义“namesTrainLoader”时,是否意味着shuffle结束,接下来的迭代将基于固定的数据顺序?定义了 namesTrainLoader 后,for 循环中会不会有任何随机性?

我试图用一些特殊值替换“batch_data”的一半:
for batch_data in namesTrainLoader:
batch_data[:8] = special_val
pre = model(batch_data)

假设将有无数个时代,“模型”最终会看到“namesTrainLoader”中的所有数据吗?还是说“namesTrainLoader”的一半数据实际上丢给了“model”?

最佳答案

混洗在创建迭代器时发生。在 for 循环的情况下,这发生在 for 循环开始之前。

您可以使用以下命令手动创建迭代器:

# Iterator gets created, the data has been shuffled at this point.
data_iterator = iter(namesTrainLoader)

默认情况下,数据加载器使用 torch.utils.data.RandomSampler 如果您设置 shuffle=True (不提供您自己的采样器)。它的实现非常简单,您可以通过查看 RandomSampler.__iter__ 来查看创建迭代器时数据在何处混洗。方法:

def __iter__(self):
n = len(self.data_source)
if self.replacement:
return iter(torch.randint(high=n, size=(self.num_samples,), dtype=torch.int64).tolist())
return iter(torch.randperm(n).tolist())

return 语句是重排发生的重要部分。它只是创建索引的随机排列。

这意味着每次完全使用迭代器时,您都会看到整个数据集,只是每次的顺序不同。因此没有数据丢失(不包括 drop_last=True 的情况)并且您的模型将看到每个时期的所有数据。

关于python - Pytorch 的数据加载器 shuffle 何时发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61718947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com