2017-01-29 2 views
19

Как использовать torch.utils.data.Dataset и torch.utils.data.DataLoader по своим собственным данным (а не только torchvision.datasets)?PyTorch: Как использовать DataLoaders для пользовательских наборов данных

Есть ли способ использовать встроенные DataLoaders, которые они используют на TorchVisionDatasets для использования в любых наборах данных?

ответ

21

Да, это возможно. Просто создайте объекты самостоятельно, например.

import torch.utils.data as data_utils 

train = data_utils.TensorDataset(features, targets) 
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True) 

где features и targets тензоры. features должен быть двухмерным, то есть матрицей, где каждая строка представляет один образец обучения, а targets может быть 1-D или 2-D, в зависимости от того, пытаетесь ли вы предсказать скаляр или вектор.

Надеюсь, что это поможет!


EDIT: ответ на вопрос @ Sarthak в

В основном да. Если вы создаете объект типа TensorData, то конструктор исследует, имеют ли первые размеры тензора признака (который на самом деле называется data_tensor) и целевой тензор (так называемый target_tensor) такой же длины:

assert data_tensor.size(0) == target_tensor.size(0) 

Однако, если вы хотите впоследствии пополнить эти данные в нейронную сеть, тогда вам нужно быть осторожным. Хотя уровни свертки работают над такими данными, как ваши, (я думаю), все остальные типы слоев ожидают, что данные будут представлены в матричной форме. Таким образом, если вы столкнулись с такой проблемой, то простым решением было бы преобразовать ваш 4D-набор данных (заданный как какой-то тензор, например FloatTensor) в матрицу, используя метод view. Для вашего 5000xnxnx3 набора данных, это будет выглядеть так:

2d_dataset = 4d_dataset.view(5000, -1) 

(. Значение -1 говорит PyTorch, чтобы выяснить длину второго измерения автоматически)

+0

У меня есть 3D-функции: 2D для изображения и одно дополнительное измерение для цветовых каналов. Будет ли он работать, если я передам функции как 5000xnxnx3. 5000 - количество точек данных nxnx3 - размер изображения – Sarthak

+0

В принципе, да, но проверьте изменение моего ответа. – pho7

+0

4d Dataset может быть передан как функции, в которых нет необходимости в представлении вида. – Sarthak

5

Вы можете легко сделать это можно расширяющий data.Dataset класс , Согласно API, все, что вам нужно сделать, это реализовать две функции: __getitem__ и __len__.

Затем вы можете обернуть набор данных с помощью DataLoader, как показано в API и в ответе @ pho7.

Я думаю, что класс ImageFolder является ссылкой. См. Код here.

Смежные вопросы