Создание и обучение CNN в PyTorch
nn.Conv2d, nn.MaxPool2d, nn.Linear, цикл обучения, оптимизатор, функция потерь, отслеживание точности
«Создание и обучение CNN в PyTorch» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Зачем нужны CNN для изображений?
Свёрточные нейронные сети изучают пространственные закономерности: сначала границы и текстуры, затем формы и объекты. Свёрточные операции используют одни и те же веса по всему изображению, благодаря чему CNN эффективны и устойчивы к смещениям. Это основа компьютерного зрения.
import torch
import torch.nn as nnБазовый класс nn.Module
Модели являются подклассами nn.Module. В __init__ Вы задаёте слои, а в forward — поток данных. PyTorch автоматически отслеживает параметры и градиенты.
class CNN(nn.Module):
def __init__(self):
super().__init__()Свёрточные слои
nn.Conv2d(in_channels, out_channels, kernel_size) перемещает обучаемые фильтры по изображению, создавая карты признаков. Первый свёрточный слой принимает 3 канала (RGB) и выдаёт больше каналов, каждый из которых улавливает разные признаки.
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)Слои подвыборки
nn.MaxPool2d уменьшает карты признаков, оставляя максимальное значение в каждом окне. Это сокращает пространственный размер, уменьшает вычислительные затраты и немного повышает устойчивость к смещениям.
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)Полносвязные слои
После свёрточных операций преобразуйте признаки в одномерный вид и передайте их через слои nn.Linear, чтобы получить оценки классов. Последний Linear выдаёт одно значение для каждого класса.
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, 10) # 10 classesМетод forward
Метод forward определяет поток данных: свёрточный слой, затем ReLU, затем подвыборка; эта последовательность повторяется, после чего признаки преобразуются в одномерный вид и передаются в линейные слои. F.relu добавляет нелинейность, благодаря которой сеть может изучать сложные закономерности.
import torch.nn.functional as F
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(x.size(0), -1) # flatten
x = F.relu(self.fc1(x))
return self.fc2(x)Функция потерь и оптимизатор
Для классификации используйте CrossEntropyLoss. Оптимизатор, например Adam, обновляет веса с помощью градиентов. Передайте ему параметры модели и скорость обучения.
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)Цикл обучения: обнуление градиентов
Каждый шаг начинается с очистки старых градиентов с помощью optimizer.zero_grad(). Если пропустить этот вызов, градиенты будут накапливаться между пакетами и испортят обновления.
for images, labels in loader:
optimizer.zero_grad()Прямой проход и функция потерь
Пропустите пакет через модель, чтобы получить предсказания, а затем вычислите функцию потерь, сравнив предсказания с истинными метками. Функция потерь — это одно число, показывающее, насколько модель ошибается.
outputs = model(images)
loss = criterion(outputs, labels)Обратное распространение и шаг
loss.backward() вычисляет градиенты с помощью автоматического дифференцирования, а optimizer.step() корректирует веса, уменьшая значение функции потерь. Вместе они составляют один шаг обучения.
loss.backward()
optimizer.step()Отслеживание точности
Контролируйте прогресс, подсчитывая правильные предсказания. Возьмите argmax от выходных значений, чтобы получить предсказанные классы, сравните их с метками и разделите число совпадений на общее количество примеров.
preds = outputs.argmax(dim=1)
correct = (preds == labels).sum().item()
acc = correct / labels.size(0)
print("batch acc:", acc)Быстрая проверка
Проверьте, насколько хорошо Вы понимаете цикл обучения.
Повторение: создание и обучение CNN
Вы создали CNN, унаследовав модель от nn.Module и добавив слои nn.Conv2d, nn.MaxPool2d и nn.Linear, а также метод forward. Вы обучали её с помощью цикла, включающего zero_grad, прямой проход, loss.backward() и optimizer.step(), а точность отслеживали через argmax.
Часто задаваемые вопросы
Урок «Создание и обучение CNN в PyTorch» бесплатный?
Да — полный текст урока «Создание и обучение CNN в PyTorch» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «Создание и обучение CNN в PyTorch»?
nn.Conv2d, nn.MaxPool2d, nn.Linear, цикл обучения, оптимизатор, функция потерь, отслеживание точности Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Создание и обучение CNN в PyTorch»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Тензоры PyTorch и Autograd
- Пользовательские наборы данных и DataLoaders
- Создание и обучение CNN в PyTorch
- Обнаружение объектов с YOLOv8