У меня есть набор данных с 10000 образцов, где классы представлены в упорядоченном виде. Сначала я загрузил данные в ImageFolder, затем в DataLoader, и я хочу разделить этот набор данных на набор train-val-test. Я знаю, что класс DataLoader имеет параметр перемешивания, но это не очень хорошо для меня, потому что он перемешивает данные только тогда, когда на нем происходит перечисление. Я знаю о функции RandomSampler, но с ее помощью я могу случайным образом взять только n объемов данных из набора данных, и я не могу контролировать, что извлекается, поэтому один образец может присутствовать в наборе train, test и val. в то же время.
Есть ли способ перетасовать данные в DataLoader? Единственное, что мне нужно, это перетасовать, после этого я могу подмножить данные.
Класс набора данных Subset
принимает индексы (https://pytorch.org/docs/stable/data.html#torch.utils.data.Подмножество). Вероятно, вы можете использовать это, чтобы получить эту функциональность, как показано ниже. По сути, вы можете уйти, перетасовав индексы, а затем выбрав подмножество набора данных.
# suppose dataset is the variable pointing to whole datasets
N = len(dataset)
# generate & shuffle indices
indices = numpy.arange(N)
indices = numpy.random.permutation(indices)
# there are many ways to do the above two operation. (Example, using np.random.choice can be used here too
# select train/test/val, for demo I am using 70,15,15
train_indices = indices [:int(0.7*N)]
val_indices = indices[int(0.7*N):int(0.85*N)]
test_indices = indices[int(0.85*N):]
train_dataset = Subset(dataset, train_indices)
val_dataset = Subset(dataset, val_indices)
test_dataset = Subset(dataset, test_indices)