Использование загрузчика данных для выборки с заменой в pytorch

#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]
 

Во время обучения я хотел бы отбирать партии m обучающих выборок с заменой; например, первая итерация включает индексы данных [1, 5, 6] , вторая итерация включает точки [12, 3, 5] данных и т. Д. и т. Д. Таким образом, общее количество итераций является входным, а не N/m

Есть ли способ dataloader справиться с этим? Если нет, то есть ли какой-либо другой метод, кроме чего-то в форме

 for i in range(iter):
    x = np.random.choice(range(N), m, replace=True)
 

чтобы осуществить это?

Ответ №1:

Вы можете использовать RandomSampler , это утилита, которая скользит между набором данных и загрузчиком данных:

 >>> ds = MyDataset(N)
>>> sampler = RandomSampler(ds, replacement=True, num_samples=M)
 

Выше, sampler будет произведена выборка в общей сложности M (замена, конечно, необходима, если num_samples > len(ds) ). В вашем примере M = iter*m .

Затем вы можете инициализировать a DataLoader с помощью sampler :

 >>> dl = DataLoader(ds, sampler=sampler, batch_size=2)
 

Вот возможный результат с 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])
 

Комментарии:

1. Отличное решение! Спасибо. 🙏