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:
#...