PyTorch: как использовать DataLoaders для пользовательских наборов данных

Как использовать torch.utils.data.Dataset а также torch.utils.data.DataLoader по вашим собственным данным (не только torchvision.datasets)?

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

5 ответов

Решение

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

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, в зависимости от того, пытаетесь ли вы предсказать скаляр или вектор.

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


РЕДАКТИРОВАТЬ: ответ на вопрос @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, чтобы автоматически определить длину второго измерения.)

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

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

я думаю ImageFolder класс является ссылкой. Смотрите код здесь.

Да, ты можешь сделать это. Надеюсь, это поможет будущим читателям.

from torch.utils.data import TensorDataset, DataLoader
import torch.utils.data as data_utils

inputs = [[ 1,  2,  3,  4,  5],[ 2,  3,  4,  5,  6]]
targets = [ 6,7]
batch_size = 2

inputs  = torch.tensor(inputs)
targets = torch.IntTensor(targets)
    
dataset =TensorDataset(inputs, targets)
data_loader = DataLoader(dataset, batch_size, shuffle = True)

В дополнение к ответу user3693922 и принятому ответу, которые соответственно связывают "быстрый" пример документации PyTorch для создания пользовательских загрузчиков данных для пользовательских наборов данных и создания пользовательского загрузчика данных в "простейшем" случае, существует гораздо более подробный специальный официальный учебник по PyTorch. о том, как создать пользовательский загрузчик данных с соответствующей предварительной обработкой: "написание пользовательских наборов данных, загрузчики данных и преобразования" официальный учебник PyTorch

Да. Pytorch предназначен для Datasetобъект в качестве входных данных, но все, что для этого требуется, это объект с __getitem__а также __len__атрибут, поэтому подойдет любой универсальный контейнер.

Например, список кортежей с вашими функциями (значения x) в качестве первого элемента и целями (значения y) в качестве второго элемента может быть передан непосредственно в DataLoaderвот так:

      x = [6,3,8,2,5,9,7]
y = [1,0,1,0,0,1,1]

data = [*zip(x,y)]
dataloader = torch.utils.data.DataLoader(data)

for features, targets in dataloader:
    #...
Другие вопросы по тегам