#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. Отличное решение! Спасибо. 🙏