Рубрики
Без рубрики

Pytorch Dataloader

Мы будем покрывать Pytorch DataLoader в этом руководстве. Большие наборы данных незаменимы в мире машинного обучения и глубоко изучения в наши дни.

Автор оригинала: Pankaj Kumar.

Мы будем покрывать Pytorch DataLoader в этом руководстве. Большие наборы данных незаменимы в мире машинного обучения и глубоко изучения в наши дни. Однако работа с большими наборами данных требует загрузки их в память все сразу.

Это приводит к отключению памяти и замедления программ. Pytorch предлагает решение для параллелизма процесса загрузки данных при поддержке автоматической партии. Это DataLoader Класс, присутствующий в Torch.utils.data упаковка.

Pytorch DataLoader Syntax.

Класс DataLoader имеет следующий конструктор:

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None)

Давайте перейдем к аргументам один за другим.

  1. DataSet – Обязательно для построенного класса DataLoader будет сконструирован с набором данных. Pytorch DataLoaders поддерживает два вида наборов данных:

    • Наборы данных в стиле карты – Эти наборы набора набора клавиш карт к образцам данных. Каждый элемент извлекается на __get_item __ () Реализация метода.
    • Наборы данных в стиле Iterable – Эти наборы данных реализуют __er __ () протокол. Такие наборы данных извлекают данные в последовательности потока, а не делают случайные чтения, как в случае наборов данных карты.
  2. Размер партии – относится к количеству образцов в каждой партии.
  3. Shuffle – Хотите ли вы, чтобы данные были изменены или нет.
  4. Sampler – относится к необязательному экземпляру класса Torch.utils.data.sampler. Sampler определяет стратегию для получения образца – последовательной или случайной или любой другой манеры. Shuffle должен быть установлен на false, когда используется пробоотборник.
  5. Batch_sampler – То же, что и сэмплер данных, определенный выше, но работает на пакетном уровне.
  6. num_workers – Количество подпроцессов, необходимых для загрузки данных.
  7. collate_fn – Содержит образцы в партии. Индивидуальное сопоставление возможно в горелке.
  8. pin_memory – Накрепленные (заблокированные страницами) местоположения памяти используются GPU для более быстрого доступа к данным. При настроек True, эта опция позволяет загрузчику данных копировать тензор в память CUDA запись.
  9. Drop_Last – Если общий размер данных не является множеством Batch_size, последняя партия имеет меньшее количество элементов, чем Batch_size. Эта неполная партия может быть сброшена, установив эту опцию для True.
  10. Тайм-аут – Устанавливает время ожидания при сборе партии у рабочих (подпроцессов).
  11. worker_init_fn – Определяет рутину, которая должна называться каждым рабочим процессом. Позволяет индивидуальные процедуры.

Давайте теперь посмотрим на несколько примеров того, как использовать DataLoaders.

Pytorch DataLoaders на встроенных наборах данных

Mnist – это набор данных, содержащий изображения вручную цифры. Это одна из самых часто используемых наборов данных в глубоком обучении. Вы можете загрузить набор данных Mnist, следующим образом.

import torch
import matplotlib.pyplot as plt
from torchvision import datasets, transforms

Прежде чем мы продолжим, это поможет немного узнать о Торговые преобразования Мы только что импортировали. Преобразование обычно используются с наборами данных изображения, чтобы выполнять такие операции, как нормализация, изменение размера, обрезки и т. Д.

Преобразования в целом сложены вместе с использованием композитной функции и применяются к изображениям в наборе данных после преобразования их в тензор.

Единственная операция, которую мы должны выполнять на изображениях Mnist, это нормализация. Мы передаем значения 0,5 и 0,5 к преобразованию нормализации для преобразования пикселей в значения от 0 до 1, в распределение со средним 0,5 и стандартным отклонением 0,5.

# Define a transform to normalize the data
transform = transforms.Compose([transforms.ToTensor(),
                              transforms.Normalize((0.5,), (0.5,)),
                              ])

Теперь мы загружаем встроенный набор данных на «~/.pytorch/mnist_data/» в наше рабочее место в качестве набора набора горелок, а затем создать загрузчик данных, используя этот набор данных.

# Download and load the training data
trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

Чтобы получить доступ к изображениям из набора данных, все, что нам нужно сделать, это вызвать функцию ITER () на Data Doader, который мы определили здесь с именем Загрузчик Отказ Теперь мы можем получить доступ к изображениям в наборе данных, используя .Next () функция.

dataiter = iter(trainloader)
images, labels = dataiter.next()
print(images.shape)
print(labels.shape)
plt.imshow(images[1].numpy().squeeze(), cmap='Greys_r')

Следующие детали, касающиеся размера партии, напечатаны вместе с этикеткой напечатанного изображения.

torch.Size([64, 1, 28, 28])
torch.Size([64])
tensor(2)

DataLoaders на Custom DataSets

Pytorch позволяет вам создавать пользовательские наборы данных и реализовывать погрузчики данных. Это делает программирование в Pytorch очень гибким.

Чтобы определить пользовательский набор набора данных, вам нужно переопределить две основные функции torch.util.data.dataset Класс – __len__ и __getitem__ – которые используются для извлечения размера набора данных и получают образец элемента из определенного индекса соответственно.

Давайте создадим пример набора данных для иллюстрации этого. Мы создаем набор данных, который содержит 1000 случайно сгенерированных номеров.

from torch.utils.data import Dataset
import random

class SampleDataset(Dataset):
  def __init__(self,r1,r2):
    randomlist=[]
    for i in range(1,1000):
      n = random.randint(r1,r2)
      randomlist.append(n)
    self.samples=randomlist

  def __len__(self):
      return len(self.samples)

  def __getitem__(self,idx):
      return(self.samples[idx])

dataset=SampleDataset(4,445)
dataset[100:120]

Выход:

[439, 131, 338, 15, 212, 34, 44, 288, 387, 273, 324, 214, 115, 205, 213, 66, 226, 123, 65, 14]

Теперь мы можем определить погрузчик данных на этом пользовательском наборе данных.

from torch.utils.data import DataLoader
loader = DataLoader(dataset,batch_size=12, shuffle=True, num_workers=2 )
for i, batch in enumerate(loader):
        print(i, batch)

Выход вышеуказанного кода будет данными, разделенными на партии 12. Некоторые из полученных партий показаны ниже.

0 tensor([417, 410,   9, 261, 357, 288, 368,  97, 411,   8, 181,  80])
1 tensor([ 27,  59, 159, 392, 402, 294,  69,  67, 201, 427, 243, 402])
2 tensor([142, 267,  21, 399, 192, 377, 425, 270,  83, 370, 237, 199])
3 tensor([266, 305,  41, 315, 231, 260, 254, 383, 266, 285, 165, 118])
4 tensor([265, 320,  92, 162, 192, 153,  49, 344,  97, 240, 312, 192])
5 tensor([417,  35, 109,  75, 288, 258, 218, 275, 158, 251,  71, 276])
6 tensor([203,  86, 291, 429,  93, 334, 288, 392, 167, 242, 430, 194])
7 tensor([ 79,  52, 421, 147, 119,  76, 131,  28,  13, 277, 270, 164])
8 tensor([ 56, 410, 253, 159, 318,  68, 342, 260,  23, 289, 326, 134])
9 tensor([ 55,   9, 132, 353,  43, 225, 188, 217, 387,  32, 214, 242])
10 tensor([131,   6, 106, 191,  89,  91,  81, 271, 247, 347, 259, 366])

Заключение

Как видите, DataLoader Pytorch можно использовать как с пользовательскими, так и встроенными наборами набора данных. DataLoaders pytorch дают гораздо более быстрый доступ к данным, чем обычный ввод/вывод, выполненный на диске. Мы надеемся, что этот учебник помог вам понять DataLoader Pytorch в гораздо лучшую способ.