Создает ли DataLoader, созданный из ConcatDataset, пакет из разных файлов или из одного файла? - PullRequest
0 голосов
/ 13 октября 2019

Я работаю с несколькими файлами и несколькими учебными образцами в каждом файле. Я буду использовать ConcatDataset, как описано здесь:

https://discuss.pytorch.org/t/dataloaders-multiple-files-and-multiple-rows-per-column-with-lazy-evaluation/11769/7

Мне нужно иметь отрицательные образцы в дополнение к моим истинным образцам, и мне нужно, чтобы мои отрицательные образцы были случайным образом выбраны из всехфайлы обучающих данных. Итак, мне интересно, будут ли возвращенные пакетные образцы просто случайным последовательным чаком из одного файла, или будет пакетный интервал по нескольким случайным индексам во всех файлах данных?

Если есть дополнительные сведения о том, чтоЯ пытаюсь сделать именно это, потому что я пытаюсь тренироваться через TPU с Pytorch XLA.

Обычно для отрицательных образцов я бы просто использовал 2-ой DataSet и DataLoader, однако я пытаюсь тренироваться на TPU с Pytorch XLA (альфа была выпущена всего несколько дней назад https://github.com/pytorch/xla), и для этого мне нужно отправить мой DataLoader объекту torch_xla.distributed.data_parallel.DataParallel, например model_parallel(train_loop_fn, train_loader), который можно увидеть в этих примерах ноутбуков

https://github.com/pytorch/xla/blob/master/contrib/colab/resnet18-training-xrt-1-15.ipynb

https://github.com/pytorch/xla/blob/master/contrib/colab/mnist-training-xrt-1-15.ipynb

Итак, теперь я ограничен одним DataLoader, который должен обрабатывать как истинные, так и отрицательные выборки, которые необходимо случайным образом выбирать из всех моих файлов.

1 Ответ

3 голосов
/ 13 октября 2019

ConcatDataset - это пользовательский класс, который находится в подклассе от torch.utils.data.Dataset. Давайте рассмотрим один пример.

class ConcatDataset(torch.utils.data.Dataset):
    def __init__(self, *datasets):
        self.datasets = datasets

    def __getitem__(self, i):
        return tuple(d[i] for d in self.datasets)

    def __len__(self):
        return min(len(d) for d in self.datasets)

train_loader = torch.utils.data.DataLoader(
             ConcatDataset(
                 dataset1, 
                 dataset2
             ),
             batch_size=args.batch_size, 
             shuffle=True,
             num_workers=args.workers, 
             pin_memory=True)

for i, (input, target) in enumerate(train_loader):
    ...

Здесь два набора данных, а именно dataset1 (список примеров) и dataset2, объединены в единый обучающий набор данных. Функция __getitem__ возвращает один пример из набора данных и будет использоваться BatchSampler для формирования обучающих мини-пакетов.

Будут ли возвращенные выборки партии случайным последовательным патроном изодин файл или будет пакетный интервал между несколькими случайными индексами во всех файлах данных?

Поскольку вы объединили все свои файлы данных в один набор данных, теперь это зависит от того, какой BatchSampler вы используетепробовать мини-партии. В PyTorch реализовано несколько сэмплеров, например, RandomSampler, SequentialSampler, SubsetRandomSampler, WeightedRandomSampler. См. Их использование в документации .

Вы также можете настроить свой BatchSampler следующим образом.

class MyBatchSampler(Sampler):
    def __init__(self, *params):
        # write your code here

    def __iter__(self):
        # write your code here
        # return an iterable

    def __len__(self):
        # return the size of the dataset

Функция __iter__ должна возвращать итерируемое значениемини-партии. Вы можете реализовать свою логику формирования мини-пакетов в этой функции.

Для случайной выборки отрицательных примеров для обучения одной из альтернатив может быть выбор отрицательных примеров для каждого положительного примера в функции __init__ функции ConcatDataset класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...