PyTorch Dataset / Dataloader batching - PullRequest
0 голосов
/ 19 июня 2020

Меня немного смущает «лучшая практика» для реализации конвейера данных PyTorch для данных временных рядов.

У меня есть файл HD5, который я прочитал с помощью специального DataLoader. Кажется, что я должен вернуть образцы данных в виде кортежа (функций, целей) с формой каждого из них (L, C), где L - это seq_len, а C - количество каналов, т.е. не выполнять предварительную пакетную обработку в загрузчик данных, просто верните его в виде таблицы.

Модули PyTorch, похоже, требуют пакетного dim, т.е. Conv1D ожидает (N, C, L).

У меня создалось впечатление, что класс DataLoader добавит размер пакета, но это не так, я получаю данные в форме (N, L).

dataset = HD5Dataset(args.dataset)

dataloader = DataLoader(dataset,
                        batch_size=N,
                        shuffle=True,
                        pin_memory=is_cuda,
                        num_workers=num_workers)

for i, (x, y) in enumerate(train_dataloader):
    ...

В приведенном выше коде x имеет вид (N, C), а не (1, N, C), что приводит к приведенному ниже коду (из publi c git репо) не удалось выполнить в первой строке.

def forward(self, x):
    """expected input shape is (N, L, C)"""
    x = x.transpose(1, 2).contiguous() # input should have dimension (N, C, L)

В документации указано Когда разрешена автоматизация c пакетная обработка Он всегда добавляет новое измерение в качестве измерения пакета что наводит меня на мысль, что automati c пакетирование отключено , но я не понимаю почему?

1 Ответ

0 голосов
/ 19 июня 2020

Я обнаружил несколько вещей, которые, кажется, работают, один из вариантов - использовать collate_fn DataLoader, но более простой вариант - использовать BatchSampler ie

dataset = HD5Dataset(args.dataset)
train, test = train_test_split(list(range(len(dataset))), test_size=.1)

train_dataloader = DataLoader(dataset,
                        pin_memory=is_cuda,
                        num_workers=num_workers,
                        sampler=BatchSampler(SequentialSampler(train),batch_size=len(train), drop_last=True)
                        )

test_dataloader = DataLoader(dataset,
                        pin_memory=is_cuda,
                        num_workers=num_workers,
                        sampler=BatchSampler(SequentialSampler(test),batch_size=len(test), drop_last=True)
                        )

for i, (x, y) in enumerate(train_dataloader):
    print (x,y)

Это преобразует набор данных dim (L, C) в один пакет (1, L, C) (не особенно эффективно).

...