Пользовательские наборы данных и DataLoaders
torch.utils.data.Dataset, __len__/__getitem__, DataLoader, преобразования, аугментация
«Пользовательские наборы данных и DataLoaders» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Подача данных в модель
Для обучения нужен эффективный способ чтения, преобразования и группировки данных. PyTorch предоставляет две абстракции: набор данных (знает, как получить один пример) и DataLoader (объединяет примеры в пакеты и перемешивает их).
from torch.utils.data import Dataset, DataLoaderИнтерфейс набора данных
Пользовательский подкласс Dataset должен реализовать два метода: __len__ (количество примеров) и __getitem__ (возврат примера по индексу). PyTorch вызывает их для извлечения данных.
Реализация __len__
__len__ сообщает PyTorch размер набора данных, чтобы тот знал, сколько существует индексов и сколько пакетов содержит одна эпоха.
class ImageDataset(Dataset):
def __init__(self, paths, labels):
self.paths = paths
self.labels = labels
def __len__(self):
return len(self.paths)Реализация __getitem__
__getitem__ загружает и возвращает один пример и его метку по заданному индексу. Здесь Вы открываете файл изображения и преобразуете его в тензор.
from PIL import Image
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
label = self.labels[idx]
return img, labelЗачем нужны преобразования?
Размер и диапазон значений пикселей исходных изображений могут различаться. Преобразования приводят их к единому виду: изменяют размер до фиксированной формы, преобразуют изображение в тензор и нормализуют значения пикселей, чтобы модель обучалась стабильно.
from torchvision import transformstransforms.Compose
transforms.Compose объединяет несколько преобразований в один конвейер, применяемый по порядку. Типичная последовательность: Resize, затем ToTensor, затем Normalize.
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])Как работают преобразования
Resize задаёт фиксированный пространственный размер; ToTensor преобразует изображение PIL в тензор и масштабирует значения пикселей в диапазон [0,1]; Normalize сдвигает и масштабирует каждый канал до нулевого среднего и единичной дисперсии, что ускоряет сходимость.
Применение преобразований в наборе данных
Передайте преобразование в набор данных и применяйте его внутри __getitem__, чтобы каждый извлекаемый пример проходил одинаковую предварительную обработку.
class ImageDataset(Dataset):
def __init__(self, paths, labels, transform):
self.paths, self.labels, self.transform = paths, labels, transform
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
return self.transform(img), self.labels[idx]Обёртывание в DataLoader
DataLoader превращает набор данных в итерируемую последовательность пакетов. Установите batch_size, чтобы задать количество примеров на шаг, и shuffle=True, чтобы перемешивать порядок на каждой эпохе — это важно для обучения.
dataset = ImageDataset(paths, labels, tf)
loader = DataLoader(dataset, batch_size=32, shuffle=True)num_workers для ускорения
num_workers запускает параллельные дочерние процессы, которые загружают и преобразуют данные, пока GPU обучает модель, скрывая задержки ввода-вывода. Значение вроде 4 часто позволяет постоянно снабжать GPU данными, не заставляя его ждать.
loader = DataLoader(
dataset,
batch_size=32,
shuffle=True,
num_workers=4
)Перебор пакетов
Перебирайте DataLoader, чтобы получать тензоры, объединённые в пакеты. На каждой итерации возвращается (images, labels), где изображения имеют форму [batch_size, channels, H, W] и готовы для подачи в модель.
for images, labels in loader:
print(images.shape) # torch.Size([32, 3, 224, 224])
breakБыстрая проверка
Проверьте, насколько хорошо Вы понимаете конвейер обработки данных.
Повторение: наборы данных и DataLoader
Вы создали пользовательский Dataset с методами __len__ и __getitem__, предварительно обработали изображения с помощью transforms.Compose (Resize, ToTensor, Normalize) и обернули набор в DataLoader с параметрами batch_size, shuffle и num_workers, чтобы эффективно подавать пакеты в модель.
Часто задаваемые вопросы
Урок «Пользовательские наборы данных и DataLoaders» бесплатный?
Да — полный текст урока «Пользовательские наборы данных и DataLoaders» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Пользовательские наборы данных и DataLoaders»?
torch.utils.data.Dataset, __len__/__getitem__, DataLoader, преобразования, аугментация Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Пользовательские наборы данных и DataLoaders»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Тензоры PyTorch и Autograd
- Пользовательские наборы данных и DataLoaders
- Создание и обучение CNN в PyTorch
- Обнаружение объектов с YOLOv8