Предыдущий ‹‹ Введение в PyTorch (1/7)

PyTorch предоставляет два примитива данных: torch.utils.data.DataLoader и torch.utils.data.Dataset, которые позволяют использовать предварительно загруженные наборы данных, а также ваши собственные данные. . Dataset хранит образцы и соответствующие им метки, а DataLoader оборачивает итерацию вокруг набора данных, чтобы обеспечить легкий доступ к образцам.

Библиотеки предметной области PyTorch предоставляют ряд примеров предварительно загруженных наборов данных, таких как FashionMNIST, которые являются подклассом torch.utils.data.Dataset и реализуют функции, специфичные для конкретных данных. Их можно найти и использовать в качестве образцов для прототипирования и тестирования вашей модели здесь:

  • Наборы данных изображений
  • Текстовые наборы данных
  • Наборы аудиоданных

Загрузить набор данных

Мы будем загружать набор данных FashionMNIST из TorchVision. FashionMNIST — это набор данных изображений статей Zalando, состоящий из 60 000 обучающих примеров и 10 000 тестовых примеров. Каждый пример содержит изображение в оттенках серого размером 28x28 и связанную с ним метку одного из 10 классов.

  • Каждое изображение имеет высоту 28 пикселей и ширину 28 пикселей, всего 784 пикселя.
  • 10 классов говорят, какой это тип изображения. Например, футболка/топ, брюки, пуловер, платье, сумка, ботильоны и т. д.
  • Оттенки серого — это значения от 0 до 255, которые измеряют интенсивность черно-белых изображений. Значение интенсивности увеличивается от белого к черному. Например, белый цвет будет равен 0, а черный — 255.

Мы загружаем набор данных FashionMNIST со следующими параметрами:

  • root — это путь, по которому хранятся данные обучения/тестирования.
  • train указывает обучающий или тестовый набор данных.
  • download = True загружает данные из Интернета, если они недоступны в корневом каталоге.
  • transform определяет преобразования объектов и меток.
import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
import matplotlib.pyplot as plt

training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)

Итерация и визуализация набора данных

Мы можем индексировать набор данных вручную, как список: training_data[index]. Мы используем matplotlib для визуализации некоторых образцов наших обучающих данных.

labels_map = {
    0: "T-Shirt",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7: "Sneaker",
    8: "Bag",
    9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()
    img, label = training_data[sample_idx] # Iterate training data
    figure.add_subplot(rows, cols, i)
    plt.title(labels_map[label])
    plt.axis("off")
    plt.imshow(img.squeeze(), cmap="gray")
plt.show()

Подготовка данных для обучения с помощью DataLoader

Набор данных извлекает характеристики нашего набора данных и маркирует по одному образцу за раз. При обучении модели мы обычно хотим передавать образцы «мини-пакетами», перетасовывать данные в каждую эпоху, чтобы уменьшить переобучение модели, и использовать многопроцессорность Python для ускорения извлечения данных.

В машинном обучении вам необходимо указать, какой объект и метка находятся в вашем наборе данных. Объекты являются входными, а метки — выходными. Мы обучаем функции и обучаем модель прогнозировать метку.

DataLoader — это итерация, которая абстрагирует эту сложность с помощью простого API. Чтобы использовать DataLoader, нам необходимо установить следующие параметры:

  • data — это обучающие данные, которые будут использоваться для обучения модели; и тестовые данные для оценки модели.
  • Размер пакета — это количество записей, которые будут обработаны в каждом пакете.
  • shuffle — случайная выборка данных по индексам.
from torch.utils.data import DataLoader

train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

Итерация через DataLoader

Мы загрузили набор данных в DataLoader и можем при необходимости перебирать набор данных. Каждая итерация ниже возвращает пакет train_features и train_labels (содержащий batch_size = 64 функций и меток соответственно). Поскольку мы указали shuffle = True, после перебора всех пакетов данные перемешиваются.

# Display image and label
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")

img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")

Нормализация — это распространенный метод предварительной обработки данных, который применяется для масштабирования или преобразования данных, чтобы обеспечить равный вклад в обучение от каждой функции. Например, каждый пиксель в изображениях в оттенках серого имеет значение от 0 до 255, что является признаком. Если значение одного пикселя равно 17, а значение другого пикселя — 197. Будет неравномерное распределение важности пикселей, поскольку более высокие объемы пикселей будут отклоняться от обучения. Нормализация изменяет диапазон ваших данных, не искажая их различий между нашими функциями. Эта предварительная обработка выполняется во избежание:

  • Снижение точности прогноза
  • Сложность обучения модели
  • Неблагоприятное распределение диапазонов пространственных данных.

Трансформировать

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

Все наборы данных TorchVision имеют два параметра: transform для изменения объектов и target_transform для изменения метки, которая принимает вызываемые объекты, содержащие логику преобразования. Модуль torchvision.transform предлагает несколько часто используемых преобразований «из коробки».

Функции FashionMNIST представлены в формате изображения PIL, а метки являются целыми числами. Для обучения нам нужны функции в виде нормализованных тензоров, а метки — в виде тензоров с горячим кодированием. Чтобы выполнить эти преобразования, мы используем ToTensor и Lamda.

from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

ds = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
    target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)

ТоТензор()

ToTensor преобразует изображения PIL или NumPy ndarray в FloatTensor и масштабирует значения интенсивности пикселей изображения в диапазоне [0., 1.].

Лямбда()

Lambda применяет любую пользовательскую лямбда-функцию. Здесь мы определяем функцию для преобразования целого числа в тензор с горячим кодированием. Сначала он создает тензор размером 10 (количество меток в нашем наборе данных) и вызывает scatter, который присваивает индексу value=1, заданному меткой y. Вы также можете использовать torch.nn.functional.one_hot в качестве другого варианта.

target_transform = Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))

Далее ›› Введение в PyTorch (3/7)