Неделя 7: Сверточные нейронные сети (CNN)
1. Теоретическая часть
1.1. Основы CNN
Сверточные нейронные сети (CNN) — специализированный тип нейросетей для обработки изображений и других пространственных данных.
Ключевые слои CNN
Слой
Назначение
Сверточный (Conv)
Выделение локальных признаков с помощью фильтров
Пулинг (Pooling)
Уменьшение размерности (MaxPool, AvgPool)
Полносвязный (FC)
Классификация по выделенным признакам
Параметры свертки
Размер ядра (kernel_size): 3×3, 5×5
Шаг (stride): Скорость перемещения фильтра
Дополнение (padding): Сохранение размеров (same/valid)
1.2. Архитектуры CNN
LeNet-5 (1998): Первая успешная CNN для распознавания цифр
AlexNet (2012): Победа в ImageNet (ReLU, Dropout)
ResNet (2015): Остаточные связи для глубоких сетей
2.1. Реализация CNN на PyTorch
python
Copy
import torch.nn as nn
class CNN(nn.Module):
def __init__(self, num_classes=10):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
self.relu = nn.ReLU()
self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.fc = nn.Linear(64*7*7, num_classes)
def forward(self, x):
out = self.conv1(x) # [batch, 32, 28, 28]
out = self.relu(out)
out = self.maxpool(out) # [batch, 32, 14, 14]
out = self.conv2(out) # [batch, 64, 14, 14]
out = self.relu(out)
out = self.maxpool(out) # [batch, 64, 7, 7]
out = out.reshape(out.size(0), -1)
out = self.fc(out)
return out
2.2. Обучение на CIFAR-10
python
Copy
from torchvision import datasets, transforms
# Загрузка данных
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_data = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
# Обучение
model = CNN(num_classes=10)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')
2.3. Визуализация фильтров
python
Copy
# Получение весов первого сверточного слоя
weights = model.conv1.weight.detach().cpu()
# Отображение первых 6 фильтров
fig, axes = plt.subplots(1, 6, figsize=(12, 2))
for i, ax in enumerate(axes):
ax.imshow(weights[i][0], cmap='gray')
ax.axis('off')
plt.show()
3. Домашнее задание
Задача 1: Модификация архитектуры
1. Добавьте третий сверточный слой (128 фильтров).
2. Сравните точность с базовой моделью.
Решение:
python
Copy
class EnhancedCNN(nn.Module):
def __init__(self, num_classes=10):
super(EnhancedCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
self.fc = nn.Linear(128*4*4, num_classes)
def forward(self, x):
out = self.maxpool(self.relu(self.conv1(x)))
out = self.maxpool(self.relu(self.conv2(out)))
out = self.maxpool(self.relu(self.conv3(out)))
out = out.reshape(out.size(0), -1)
out = self.fc(out)
return out
Задача 2: Batch Normalization
1. Добавьте BatchNorm после каждого сверточного слоя.
2. Проанализируйте скорость обучения.
Решение:
python
Copy
class CNNWithBN(nn.Module):
def __init__(self):
super(CNNWithBN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(32)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(64)
def forward(self, x):
out = self.relu(self.bn1(self.conv1(x))))
out = self.relu(self.bn2(self.conv2(out))))
return out
Задача 3: Реализация Data Augmentation
1. Добавьте аугментацию данных (RandomHorizontalFlip, RandomRotation).
2. Сравните результаты с/без аугментации.
Решение:
python
Copy
transform_aug = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
Итоги недели
✅ Познакомились с архитектурой CNN и сверточными слоями.
✅ Реализовали сеть для CIFAR-10 и визуализировали фильтры.
✅ Исследовали BatchNorm и аугментацию данных.
✅ Научились модифицировать архитектуры CNN.
Следующая тема: Рекуррентные нейронные сети (RNN). 🔄