Как создать наборы данных, такие как MNIST в Pytorch? - PullRequest
0 голосов
/ 07 декабря 2018

Я посмотрел исходный код Pytorch набора данных MNIST, но кажется, что он читает массивный массив напрямую из двоичных файлов.Как я могу просто создать train_data и train_labels, как это?Я уже подготовил изображения и текст с метками.

Я научился читать изображения, метки и писать get_item и len, что меня действительно смутило, как сделать train_data и train_labels , который является факелом. Тензор.Я попытался расположить их в списки Python и преобразовать в torch.Tensor, но не получилось:

for index in range(0,len(self.files)):
  fn, label = self.files[index]
  img = self.loader(fn)
  if self.transform is not None:
    img = self.transform(img)
  train_data.append(img)
self.train_data = torch.tensor(train_data)

ValueError: только тензоры одного элемента могут быть преобразованы в скаляры Python

1 Ответ

0 голосов
/ 07 декабря 2018

Есть два пути.Во-первых, руководство. Torchvision.datasets утверждает следующее:

наборы данных являются подклассами torch.utils.data.Dataset, т. Е. В них реализованы методы __getitem__ и __len__.Следовательно, все они могут быть переданы в torch.utils.data.DataLoader, который может загружать несколько семплов параллельно, используя рабочие процессы torch.multiprocessing.

Таким образом, вы можете просто реализовать свой собственный класс, который сканирует всеизображения и метки, хранит список их путей (чтобы вам не приходилось хранить их в оперативной памяти) и имеет метод __getitem__, который с указанным индексом i читает i-й файл, его метку и возвращает их.Этого минимального интерфейса достаточно для работы с параллельным загрузчиком данных в torch.utils.data .

Во-вторых, если ваш каталог данных может быть преобразован в любую структуру, выможно использовать предварительно созданные загрузчики DatasetFolder и ImageFolder .Это избавит вас от некоторого кодирования и автоматически обеспечит поддержку подпрограмм по увеличению данных из torchvision.transforms .

...