Локальні рецептивні поля
Кожен нейрон з'єднаний лише з локальною областю вхідного зображення. Це дозволяє виявляти локальні ознаки (краї, кути) незалежно від їхнього положення.
Інформативна сторінка-лабораторія про те, як працюють CNN: згортки, пулінг, активації, навчання зворотним поширенням помилки та класифікація зображень.
Згорткові нейронні мережі (Convolutional Neural Networks) — спеціалізована архітектура для обробки даних з просторовою структурою (зображення, відео). На відміну від звичайних нейромереж, CNN автоматично виявляють локальні патерни (краї, текстури, форми) і масштабують це знання на весь образ.
Кожен нейрон з'єднаний лише з локальною областю вхідного зображення. Це дозволяє виявляти локальні ознаки (краї, кути) незалежно від їхнього положення.
Один і той самий фільтр (набір ваг) застосовується до всіх позицій зображення. Це різко зменшує кількість параметрів і додає інваріантність до зсуву.
Ранні шари виявляють прості ознаки (краї), середні — складніші (текстури), глибокі — об'єкти (око, колесо). Це дозволяє будувати складні представлення.
Типова CNN складається з чергування згорткових шарів (feature extraction) та повнозв'язних шарів (classification). Розглянемо ключові компоненти.
Фільтр (kernel) ковзає по зображенню і обчислює скалярний добуток з локальною областю. Результат — карта ознак (feature map), що показує, де саме знайдено певний патерн.
Зменшує просторові розміри, вибираючи максимальне значення з вікна (зазвичай 2×2). Це робить мережу інваріантною до дрібних зсувів і зменшує обчислення.
f(x) = max(0, x) — найпопулярніша активація в CNN. Вона нелінійна, проста для обчислення і допомагає уникнути проблеми зникаючого градієнта.
Нормалізує активації кожного шару до нульового середнього і одиничної дисперсії. Прискорює навчання і робить його стабільнішим.
Блок нижче моделює роботу згорткового шару з різними параметрами. Спостерігайте, як змінюється розмір виходу та обчислювальна складність.
Типова організація: окремі модулі для архітектури, тренування та оцінки. Нижче приклад простої CNN для класифікації MNIST.
# model.py
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+class SimpleCNN(nn.Module):
+ def __init__(self, num_classes=10):
+ super(SimpleCNN, self).__init__()
+ # Згорткові шари
+ self.conv1 = nn.Conv2d(1, 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)
+
+ # Batch normalization
+ self.bn1 = nn.BatchNorm2d(32)
+ self.bn2 = nn.BatchNorm2d(64)
+ self.bn3 = nn.BatchNorm2d(128)
+
+ # Pooling та dropout
+ self.pool = nn.MaxPool2d(2, 2)
+ self.dropout = nn.Dropout(0.5)
+
+ # Повнозв'язні шари
+ self.fc1 = nn.Linear(128 * 3 * 3, 256)
+ self.fc2 = nn.Linear(256, num_classes)
+
+ def forward(self, x):
+ # Блок 1: 28x28 -> 14x14
+ x = self.pool(F.relu(self.bn1(self.conv1(x))))
+ # Блок 2: 14x14 -> 7x7
+ x = self.pool(F.relu(self.bn2(self.conv2(x))))
+ # Блок 3: 7x7 -> 3x3
+ x = self.pool(F.relu(self.bn3(self.conv3(x))))
+
+ x = x.view(x.size(0), -1) # Flatten
+ x = F.relu(self.fc1(x))
+ x = self.dropout(x)
+ x = self.fc2(x)
+ return x
# train.py
+import torch.optim as optim
+from torch.utils.data import DataLoader
+from torchvision import datasets, transforms
+
+def train_model(model, epochs=10, lr=0.001):
+ # Підготовка даних
+ transform = transforms.Compose([
+ transforms.ToTensor(),
+ transforms.Normalize((0.1307,), (0.3081,))
+ ])
+
+ train_dataset = datasets.MNIST('./data', train=True,
+ download=True, transform=transform)
+ train_loader = DataLoader(train_dataset, batch_size=64,
+ shuffle=True)
+
+ # Оптимізатор та функція втрат
+ optimizer = optim.Adam(model.parameters(), lr=lr)
+ criterion = nn.CrossEntropyLoss()
+
+ model.train()
+ for epoch in range(epochs):
+ running_loss = 0.0
+ for batch_idx, (data, target) in enumerate(train_loader):
+ optimizer.zero_grad()
+ output = model(data)
+ loss = criterion(output, target)
+ loss.backward()
+ optimizer.step()
+ running_loss += loss.item()
+
+ print(f"Epoch {epoch+1}/{epochs}, "
+ f"Loss: {running_loss/len(train_loader):.4f}")
Різні архітектури пропонують компроміс між точністю, швидкістю та кількістю параметрів. Обирайте архітектуру залежно від обмежень вашого проєкту.
| Архітектура | Рік | Параметрів | Top-1 Acc | Ключова інновація | Застосування |
|---|---|---|---|---|---|
| LeNet-5 | 1998 | 60K | — | Перша працююча CNN | MNIST, OCR |
| AlexNet | 2012 | 61M | 57.1% | ReLU, Dropout, GPU | ImageNet |
| VGG-16 | 2014 | 138M | 71.3% | Глибина 3×3 згорток | Transfer Learning |
| ResNet-50 | 2015 | 25.6M | 76.1% | Skip connections | Універсальна |
| EfficientNet-B0 | 2019 | 5.3M | 77.1% | Compound scaling | Mobile/Edge |
| Vision Transformer | 2020 | 86M | 81.8% | Self-attention | Великі датасети |
Швидка перевірка ідей на підмножині даних з простою архітектурою.
Використання переднавчених ваг (ImageNet) з доопрацюванням під задачу.
Pruning, quantization, knowledge distillation для зменшення моделі.
ONNX/TensorRT для інференсу, моніторинг дрейфу даних.
Звичайні повнозв'язні мережі (Fully Connected) мають занадто багато параметрів для зображень (наприклад, 224×224×3 = 150K входів). CNN використовують:
Це зменшує параметри в 100-1000 разів при кращій якості.
Аугментація — штучне збільшення датасету шляхом трансформацій:
Це робить модель інваріантнішою до варіацій вхідних даних і зменшує overfitting.
Backpropagation в CNN аналогічне звичайним мережам, але з урахуванням:
Сучасні фреймворки (PyTorch, TensorFlow) автоматично обчислюють ці градієнти.
Global Average Pooling (GAP) усереднює кожну карту ознак в одне число. Переваги:
Використовується в ResNet, MobileNet, EfficientNet — рекомендується для нових архітектур.
Компроміси різних розмірів:
Рекомендація: починайте з 32-64 і збільшуйте, поки вистачає GPU пам'яті.
Transfer Learning — використання знань, отриманих при навчанні на великому датасеті (ImageNet), для вирішення схожої задачі з меншими даними. Підходи:
Ефективний навіть при 100-1000 зображеннях на клас.
Результат застосування фільтра до зображення. Кожна позиція показує, наскільки сильно відповідний патерн присутній у цій локації.
Матриця ваг (зазвичай 3×3 або 5×5), що ковзає по зображенню і виявляє певні ознаки (горизонтальні/вертикальні краї, текстури).
Крок, з яким фільтр переміщується по зображенню. Stride=2 зменшує розмір вдвічі, прискорюючи обчислення.
Додавання пікселів по краях зображення. "Same" padding зберігає розмір, "Valid" — зменшує. Дозволяє краям зображення мати такий же вплив на вихід.
Область вхідного зображення, що впливає на активацію нейрона. Зростає з глибиною мережі — глибокі шари "бачать" більший контекст.
Техніка регуляризації: випадкове вимкнення нейронів під час навчання. Запобігає ко-адаптації нейронів і зменшує overfitting.