在pytorch中使用dataloader进行替换采样

Bla*_*ade 5 pytorch

我有一个格式定义的数据集:

class MyDataset(Dataset):
    def __init__(self, N):
        self.N = N
        self.x = torch.rand(self.N, 10)
        self.y = torch.randint(0, 3, (self.N,))

    def __len__(self):
        return self.N

    def __getitem__(self, idx):
        return self.x[idx], self.y[idx]
Run Code Online (Sandbox Code Playgroud)

在训练过程中,我想对m训练样本进行批量采样,并进行替换;例如,第一次迭代包括数据索引[1, 5, 6],第二次迭代包括数据点[12, 3, 5],依此类推。所以迭代总数是一个输入,而不是N/m

有没有办法用来dataloader处理这个问题?如果没有,除了以下形式之外还有其他方法吗

for i in range(iter):
    x = np.random.choice(range(N), m, replace=True)
Run Code Online (Sandbox Code Playgroud)

来实施这个?

Iva*_*van 6

您可以使用RandomSampler,这是一个在数据集和数据加载器之间滑动的实用程序:

>>> ds = MyDataset(N)
>>> sampler = RandomSampler(ds, replacement=True, num_samples=M)
Run Code Online (Sandbox Code Playgroud)

以上,sampler将总共采样M(如果有的话当然需要更换num_samples > len(ds))。在你的例子中M = iter*m

然后您可以使用以下DataLoader命令初始化 a sampler

>>> dl = DataLoader(ds, sampler=sampler, batch_size=2)
Run Code Online (Sandbox Code Playgroud)

N = 2以下是、M = 2*len(ds) = 4和的可能结果batch_size = 2

>>> for x, y in dl:
...     print(x, y)

tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
        [0.0407, 0.2081, 0.5510, 0.2063, 0.1499, 0.1266, 0.1928, 0.0589, 0.2789, 0.3531]]) 
tensor([1, 0])

tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
        [0.0431, 0.0452, 0.3286, 0.5139, 0.4620, 0.4468, 0.3490, 0.4226, 0.3930, 0.2227]]) 
tensor([1, 0])

tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
        [0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735]]) 
tensor([1, 1])
Run Code Online (Sandbox Code Playgroud)