Pytorch: загрузка образца изображений с помощью DataLoader

Я использую стандартный DataLoader из torch.utils.data. Я создаю класс набора данных, а затем создаю DataLoader следующим образом:

train_dataset = LandmarksDataset(os.path.join(args.data, 'train'), train_transforms, split="train")
train_dataloader = data.DataLoader(train_dataset, batch_size=args.batch_size, num_workers=2,
                                   pin_memory=True, shuffle=True, drop_last=True)

Работает отлично, но набор данных достаточно велик - 300 тыс. Изображений. Так что чтение изображений при использовании DataLoader занимает много времени. Так что создавать такой большой DataLoader на этапе отладки - это действительно жалко! Я просто хочу проверить свою гипотезу и сделать это быстро! Для этого мне не нужно загружать весь набор данных.

Я пытаюсь найти способ Как загрузить только небольшую фиксированную часть набора данных, не создавая dataLoader для всего набора данных? В настоящий момент все мои идеи - это просто создать другую папку, скопировать сюда часть изображений и использовать на нем конвейер. Но я полагаю, Pytorch достаточно умен, чтобы иметь несколько встроенных методов для загрузки только части изображений из большого набора данных. Вы можете мне посоветовать, как это сделать?


person Mikhail_Sam    schedule 08.05.2020    source источник


Ответы (1)


Насколько мне известно, не существует механизма, который делал бы это за вас. Ваша проблема заключается в классе LandmarksDataset в том месте, где вы читаете пути к папке с данными вашего поезда. Я полагаю os.listdir(train_data_folder).

Вместо этого вы можете использовать более эффективный способ os.scandir(train_data_folder), который возвращает генератор, а вызов next() на нем даст вам пути к вашим изображениям в данных поезда. Таким образом, вы можете вызывать next () сколько угодно раз, не изменяя структуру папки данных поезда и создавая ее подмножество.

person Vlad Sirbu    schedule 08.05.2020