CNN Vision Lab
Deep Learning

Симулятор згорткових нейронних мереж для комп'ютерного зору

Інформативна сторінка-лабораторія про те, як працюють CNN: згортки, пулінг, активації, навчання зворотним поширенням помилки та класифікація зображень.

Python PyTorch / TensorFlow CNN ImageNet

Що таке CNN і навіщо вони потрібні

Згорткові нейронні мережі (Convolutional Neural Networks) — спеціалізована архітектура для обробки даних з просторовою структурою (зображення, відео). На відміну від звичайних нейромереж, CNN автоматично виявляють локальні патерни (краї, текстури, форми) і масштабують це знання на весь образ.

01

Локальні рецептивні поля

Кожен нейрон з'єднаний лише з локальною областю вхідного зображення. Це дозволяє виявляти локальні ознаки (краї, кути) незалежно від їхнього положення.

02

Спільні ваги

Один і той самий фільтр (набір ваг) застосовується до всіх позицій зображення. Це різко зменшує кількість параметрів і додає інваріантність до зсуву.

03

Ієрархія ознак

Ранні шари виявляють прості ознаки (краї), середні — складніші (текстури), глибокі — об'єкти (око, колесо). Це дозволяє будувати складні представлення.

Архітектура CNN: від пікселів до передбачень

Типова CNN складається з чергування згорткових шарів (feature extraction) та повнозв'язних шарів (classification). Розглянемо ключові компоненти.

Input
224×224×3
Conv
3×3, 64
MaxPool
2×2
Conv
3×3, 128
MaxPool
2×2
FC
4096
Output
1000
(W − F + 2P) / S + 1 = Wout    де W=вхід, F=фільтр, P=паддінг, S=крок

Операція згортки (Convolution)

Фільтр (kernel) ковзає по зображенню і обчислює скалярний добуток з локальною областю. Результат — карта ознак (feature map), що показує, де саме знайдено певний патерн.

Max Pooling

Зменшує просторові розміри, вибираючи максимальне значення з вікна (зазвичай 2×2). Це робить мережу інваріантною до дрібних зсувів і зменшує обчислення.

Функція активації ReLU

f(x) = max(0, x) — найпопулярніша активація в CNN. Вона нелінійна, проста для обчислення і допомагає уникнути проблеми зникаючого градієнта.

Batch Normalization

Нормалізує активації кожного шару до нульового середнього і одиничної дисперсії. Прискорює навчання і робить його стабільнішим.

Інтерактивний симулятор CNN-шару

Блок нижче моделює роботу згорткового шару з різними параметрами. Спостерігайте, як змінюється розмір виходу та обчислювальна складність.

Великі ядра (7×7) дають ширше рецептивне поле, але більше параметрів.
Розмір виходу -
Параметрів шару -
FLOPs (операцій) -
Рецептивне поле -
Візуалізація розмірів: Input → Output

Реалізація CNN з нуля (PyTorch)

Типова організація: окремі модулі для архітектури, тренування та оцінки. Нижче приклад простої 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}")

Порівняння архітектур CNN

Різні архітектури пропонують компроміс між точністю, швидкістю та кількістю параметрів. Обирайте архітектуру залежно від обмежень вашого проєкту.

Архітектура Рік Параметрів 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 Великі датасети

Типові помилки при навчанні CNN

  • Занадто велика learning rate — втрата не зменшується (divergence).
  • Відсутність нормалізації даних — навчання сповільнюється в 10×.
  • Overfitting на малому датасеті — відсутність augmentation/dropout.
  • Неправильна ініціалізація ваг — vanishing/exploding gradients.
  • Занадто багато параметрів для задачі — перенавчання.

Дорожня карта до production

Крок 1: Прототипування

Швидка перевірка ідей на підмножині даних з простою архітектурою.

Крок 2: Transfer Learning

Використання переднавчених ваг (ImageNet) з доопрацюванням під задачу.

Крок 3: Оптимізація

Pruning, quantization, knowledge distillation для зменшення моделі.

Крок 4: Deployment

ONNX/TensorRT для інференсу, моніторинг дрейфу даних.

FAQ

Чому CNN краще за звичайні нейромережі для зображень?

Звичайні повнозв'язні мережі (Fully Connected) мають занадто багато параметрів для зображень (наприклад, 224×224×3 = 150K входів). CNN використовують:

  • Локальні зв'язки — кожен нейрон бачить лише невеликий патч зображення.
  • Спільні ваги — один фільтр використовується всюди.
  • Інваріантність до зсуву — ознака знайдеться незалежно від положення.

Це зменшує параметри в 100-1000 разів при кращій якості.

Що таке Data Augmentation і навіщо вона потрібна?

Аугментація — штучне збільшення датасету шляхом трансформацій:

  • Геометричні: поворот, зсув, масштабування, відображення.
  • Колірні: зміна яскравості, контрасту, насиченості.
  • Шум: додавання гаусівського шуму, розмиття.

Це робить модель інваріантнішою до варіацій вхідних даних і зменшує overfitting.

Як працює зворотне поширення помилки в CNN?

Backpropagation в CNN аналогічне звичайним мережам, але з урахуванням:

  • Згортка → зворотна згортка (transposed convolution) для градієнтів.
  • Max Pooling → градієнт йде лише через максимальний елемент.
  • Спільні ваги → градієнти сумуються з усіх позицій, де використовувався фільтр.

Сучасні фреймворки (PyTorch, TensorFlow) автоматично обчислюють ці градієнти.

Коли використовувати Global Average Pooling замість FC?

Global Average Pooling (GAP) усереднює кожну карту ознак в одне число. Переваги:

  • Жодних параметрів — немає чого перенавчатися.
  • Краще інтерпретація — кожна карта ознак = клас.
  • Менше залежність від розміру вхідного зображення.

Використовується в ResNet, MobileNet, EfficientNet — рекомендується для нових архітектур.

Як обрати розмір батчу (batch size)?

Компроміси різних розмірів:

  • Малий (8-32): Шумний градієнт допомагає вибратися з локальних мінімумів, але навчання повільніше. Потрібен менший learning rate.
  • Великий (256+): Стабільніший градієнт, швидше навчання на GPU, але потребує більше пам'яті. Batch Normalization працює краще.

Рекомендація: починайте з 32-64 і збільшуйте, поки вистачає GPU пам'яті.

Що таке Transfer Learning і як його застосувати?

Transfer Learning — використання знань, отриманих при навчанні на великому датасеті (ImageNet), для вирішення схожої задачі з меншими даними. Підходи:

  • Feature extraction: Заморозити всі згорткові шари, тренувати лише класифікатор.
  • Fine-tuning: Розморозити останні шари і тренувати з малим learning rate.

Ефективний навіть при 100-1000 зображеннях на клас.

Глосарій основних термінів

Feature Map

Результат застосування фільтра до зображення. Кожна позиція показує, наскільки сильно відповідний патерн присутній у цій локації.

Kernel / Filter

Матриця ваг (зазвичай 3×3 або 5×5), що ковзає по зображенню і виявляє певні ознаки (горизонтальні/вертикальні краї, текстури).

Stride

Крок, з яким фільтр переміщується по зображенню. Stride=2 зменшує розмір вдвічі, прискорюючи обчислення.

Padding

Додавання пікселів по краях зображення. "Same" padding зберігає розмір, "Valid" — зменшує. Дозволяє краям зображення мати такий же вплив на вихід.

Receptive Field

Область вхідного зображення, що впливає на активацію нейрона. Зростає з глибиною мережі — глибокі шари "бачать" більший контекст.

Dropout

Техніка регуляризації: випадкове вимкнення нейронів під час навчання. Запобігає ко-адаптації нейронів і зменшує overfitting.