Экосистема данных: torchvision и torchtext

Знакомимся с официальными библиотеками, которые избавляют от рутины с данными.

torchvision — официальная библиотека PyTorch для работы с изображениями: готовые датасеты, преобразования и предобученные модели.

Зачем эти библиотеки

Сам PyTorch — это тензоры, autograd и слои. Но в реальной задаче половина работы — загрузить данные и привести их в нужный вид. Чтобы не писать это каждый раз заново, команда PyTorch выпускает доменные библиотеки: torchvision для картинок, исторически torchtext для текста, torchaudio для звука. Они дают три вещи: готовые датасеты, трансформации и предобученные модели.

torchvision: готовые датасеты

Популярные наборы скачиваются одной строкой и сразу совместимы с DataLoader из пятого раздела:

from torchvision import datasets, transforms
from torch.utils.data import DataLoader

train = datasets.MNIST(
    root="./data", train=True, download=True,
    transform=transforms.ToTensor(),
)
loader = DataLoader(train, batch_size=64, shuffle=True)

datasets.MNIST — это готовый Dataset: он реализует те же __len__ и __getitem__, что мы писали руками. Поэтому он сразу оборачивается в DataLoader без единой доработки.

Трансформации (transforms)

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

transform = transforms.Compose([
    transforms.Resize((224, 224)),       # привести к нужному размеру
    transforms.ToTensor(),               # PIL-картинка -> тензор [0,1]
    transforms.Normalize(                # нормализация по каналам
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]),
])

Два важных пункта. ToTensor() не только превращает картинку в тензор, но и переставляет оси в формат (каналы, высота, ширина) и масштабирует пиксели в диапазон [0, 1]. Normalize вычитает среднее и делит на стандартное отклонение — сети учатся стабильнее на нормализованных данных. Числа в примере — это статистики ImageNet, их используют с предобученными моделями из прошлого урока.

Аугментация — трансформы для регуляризации

Случайные преобразования при обучении искусственно расширяют датасет и борются с переобучением (связь с пятым разделом):

train_transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),   # случайное отражение
    transforms.RandomRotation(10),       # случайный поворот
    transforms.ToTensor(),
])

Модель видит каждую картинку каждый раз чуть иначе и не может её зазубрить. Важно: аугментацию включают только на обучении, на валидации/тесте — нет.

Готовые модели

Мы уже пользовались torchvision.models в transfer learning. Там лежат ResNet, VGG, EfficientNet и другие — с предобученными весами. Это та самая основа для дообучения.

Текст: torchtext и современный путь

Для текста исторически был torchtext, но сегодня обработку текста в PyTorch чаще делают через экосистему Hugging Face (библиотеки transformers и datasets) — там готовые токенизаторы и предобученные языковые модели. Идея та же, что у torchvision: не писать загрузку и предобработку с нуля, а взять готовое.

ДоменБиблиотекаЧто даёт
картинкиtorchvisionдатасеты, transforms, модели
звукtorchaudioаудио-датасеты и преобразования
текстHugging Faceтокенизаторы, языковые модели

Итог

  • Доменные библиотеки дают готовые датасеты, трансформации и предобученные модели.
  • torchvision.datasets совместимы с DataLoader без доработок.
  • transforms готовят данные на лету; ToTensor + Normalize — базовый минимум, аугментация — против переобучения.
  • Для текста сегодня чаще берут экосистему Hugging Face.
Проверьте себя
1. Почему datasets.MNIST из torchvision сразу работает с DataLoader?
ADataLoader умеет читать только MNIST
BЭто готовый Dataset с реализованными __len__ и __getitem__
CMNIST хранится прямо внутри DataLoader
DНужно сначала переписать его в свой класс
2. Что делает transforms.ToTensor() с картинкой?
AТолько меняет её размер
BПревращает в тензор формата (каналы, высота, ширина) с пикселями в [0, 1]
CПрименяет случайный поворот
DЗагружает картинку с диска
3. На каком этапе применяют аугментацию данных (случайные повороты, отражения)?
AНа обучении и валидации одинаково
BТолько на обучении, чтобы бороться с переобучением
CТолько на тесте
DТолько при сохранении модели
Поддержать проект