Sobes.tech
Back to questions
Middle
14

Как создать и обучить классификатор в PyTorch?

Companies where asked
АТОМ

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать понимание полного цикла: как подготовить данные, собрать модель, выбрать функцию потерь и оптимизатор, затем организовать цикл обучения и оценку качества. Важно объяснить, что классификатор в PyTorch обычно строится из nn.Module и обучается через forward, loss и backpropagation. Также ожидают понимание разницы между обучением и инференсом, а для многоклассовой и бинарной классификации — корректного выбора выхода модели и функции потерь.

Определение:

Классификатор в PyTorch — это нейросетевая модель, которая по входным признакам предсказывает класс объекта. Обычно она состоит из нескольких слоёв, а на выходе выдаёт logits или вероятности классов. Обучение заключается в том, чтобы на размеченных данных минимизировать ошибку предсказаний с помощью оптимизатора и обратного распространения градиента.

Пример использования:

Ниже — простой пример многоклассового классификатора на PyTorch:

import torch
import torch.nn as nn
import torch.optim as optim

class Classifier(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_classes):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, num_classes)
        )

    def forward(self, x):
        return self.net(x)

# Данные: признаки и метки классов
X = torch.randn(100, 20)                  # 100 объектов, 20 признаков
y = torch.randint(0, 3, (100,))           # 3 класса: 0, 1, 2

model = Classifier(input_dim=20, hidden_dim=64, num_classes=3)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3)

for epoch in range(10):
    model.train()
    optimizer.zero_grad()

    logits = model(X)
    loss = criterion(logits, y)

    loss.backward()
    optimizer.step()

    print(f"Epoch {epoch + 1}: loss = {loss.item():.4f}")

Пояснение кода:

Сначала создаётся класс модели через nn.Module, где в __init__ описывается архитектура, а в forward — путь прохождения данных. В примере вход размерности 20 проходит через скрытый слой 64 нейрона и выдаёт 3 логита, по одному на класс.

CrossEntropyLoss подходит для многоклассовой классификации, потому что ожидает сырые logits на входе и целевые метки в виде индексов классов. Adam обновляет веса модели по вычисленным градиентам. В цикле обучения сначала обнуляются старые градиенты через zero_grad(), затем считается предсказание, loss, выполняется backward(), после чего step() обновляет параметры.

Важно, что здесь модель обучается на всём наборе сразу ради простоты. В реальном проекте обычно используют DataLoader, мини-батчи, валидацию после каждой эпохи и отдельный режим model.eval() для оценки качества без обучения.

Ключевые моменты:

  • Для классификации в PyTorch обычно используют nn.Module, loss function и optimizer.
  • Для многоклассовой задачи выход модели — это logits, а не softmax; CrossEntropyLoss сам обрабатывает это корректно.
  • Для бинарной классификации часто используют один выход и BCEWithLogitsLoss, а не sigmoid вручную перед loss.
  • В обучении обязательны шаги: zero_grad(), loss.backward(), optimizer.step().
  • Для реальных задач нужны DataLoader, train/validation split и контроль переобучения.
  • В режиме инференса модель переводят в eval(), чтобы отключить поведение, зависящее от обучения.