DataSet извлекает признаки и метки из набора данных по одному образцу за раз. Но при обучении модели образцы обычно передаются небольшими пакетами (batch) - нейросети обучаются гораздо эффективнее, когда видят сразу 64 или 128 картинок за раз, а не по одной. Что к тому же позволяет использовать многопроцессорную обработку Python для ускорения извлечения данных. И для удобной загрузки пакетами применяются специальные объекты - загрузчики данных (dataloader)
В PyTorch загрузчики данных представляют объект типа torch.utils.data.DataLoader, который фактически является итерируемым объектом-оберткой вокруг Dataset. Пример подключения:
import torch from torch.utils.data import DataLoader # импортируем загрузчик данных
DataLoader представляет итерируемый объект, который абстрагирует загрузку данных с помощью простого API. Например, загрузим тестовый набор с помощью загрузчика данных:
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor
from torch.utils.data import DataLoader
# набор для обучения
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor()
)
# набор для тестирования
test_data = datasets.FashionMNIST(
root="data",
train=False,
download=True,
transform=ToTensor()
)
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)
Конструктор DataLoader принимает большое количество параметров. Рассмотрим наиболее базовые, которые были использованы в примере выше:
dataset: набор данных, из которого будут загружаться данные.
batch_size: количество выборок в пакете для загрузки (по умолчанию: 1).
shuffle: при значении True данные перемешиваются при обучении (по умолчанию: False).
Например, в примере выше инструкция
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
указывает, что будет загружаться набор training_data, количество выборок в пакете будет равно 64, и при обучении, когда с помощью загрузчика мы будем проходить по набору данных, данные будут перемешиваться при каждой итерации цикла обучения.
После загрузки набора данных в DataLoader и можем проходить по нему по мере необходимости:
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
# набор для обучения
data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor()
)
dataloader = DataLoader(data, batch_size=64, shuffle=True)
# отображаем картинку и метку
features, labels = next(iter(dataloader))
print(f"Feature batch shape: {features.size()}")
print(f"Labels batch shape: {labels.size()}")
img = features[0].squeeze()
label = labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")
В примере выше с помощью выражения iter(dataloader) создается итератор из DataLoader, а next(...) извлекает первый батч данных. Напомню, что в данном случае размер батча - 64 изображения.
Каждый батч состоит из двух компонентов:
features: тензор изображений размером (64, 1, 28, 28) (64 изображения, 1 канал, 28×28 пикселей).
labels: тензор меток классов размером (64,) (числа от 0 до 9).
А дальше идет код визуализации одного изображения
img = features[0].squeeze(): удаление размерности канала (1, 28, 28 > 28, 28).
plt.imshow(img, cmap="gray"): отображение изображения в градациях серого.
plt.show(): вывод графика.
При необходимости мы можем пройти по всем данным из загрузчика с помощью стандартного цикла:
dataloader = DataLoader(data, batch_size=64, shuffle=True)
for images, labels in dataloader:
print("Тензор изображений:")
print(images)
print("\nТензор меток:")
print(labels)