擅长:python、mysql、java
<p>当迭代器被创建时,会发生洗牌。在for循环的情况下,这发生在for循环开始之前</p>
<p>您可以使用以下工具手动创建迭代器:</p>
<pre class="lang-py prettyprint-override"><code># Iterator gets created, the data has been shuffled at this point.
data_iterator = iter(namesTrainLoader)
</code></pre>
<p>默认情况下,如果设置<code>shuffle=True</code>(不提供自己的采样器),则数据加载器使用<a href="https://pytorch.org/docs/stable/data.html#torch.utils.data.RandomSampler" rel="noreferrer">^{<cd1>}</a>。它的实现非常简单,通过查看<a href="https://github.com/pytorch/pytorch/blob/f3e620ee83f080283445aa1a7242d40e30eb6a7f/torch/utils/data/sampler.py#L103-L107" rel="noreferrer">^{<cd3>}</a>方法,您可以看到在创建迭代器时数据被洗牌的位置:</p>
<pre class="lang-py prettyprint-override"><code>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())
</code></pre>
<p>return语句是进行洗牌的重要部分。它只是创建索引的随机排列</p>
<p>这意味着您将在每次完全使用迭代器时看到整个数据集,只是每次的顺序不同。因此没有数据丢失(不包括<code>drop_last=True</code>的情况),您的模型将在每个历元看到所有数据</p>