Згорткові нейронні мережі

Середній рівень Deep Learning з PyTorch

Michal Oleszak

Machine Learning Engineer

Чому не використовувати лінійні шари?

Чорний квадрат, що представляє 256×256 зображення у відтінках сірого.

Середній рівень Deep Learning з PyTorch

Чому не використовувати лінійні шари?

Зображення 256×256 у відтінках сірого містить близько 65 тис. значень пікселів.

Середній рівень Deep Learning з PyTorch

Чому не використовувати лінійні шари?

Лінійний шар із 1000 нейронів обробляє 65 тис. значень пікселів.

Середній рівень Deep Learning з PyTorch

Чому не використовувати лінійні шари?

Між зображенням і шаром — 65 млн з'єднань.

Середній рівень Deep Learning з PyTorch

Чому не використовувати лінійні шари?

Для кольорового зображення RGB — 200 млн з'єднань.

Середній рівень Deep Learning з PyTorch

Чому не використовувати лінійні шари?

  • Лінійні шари:
    • Повільне навчання
    • Перенавчання
    • Не розпізнають просторові шаблони
  • Краща альтернатива: згорткові шари!

Зображення з котом у кутку та нейрони, що читають цю частину зображення

Середній рівень Deep Learning з PyTorch

Згортковий шар

Фільтр розміру 3×3 ковзає по вхідних даних 5×5 і утворює карту ознак 3×3.

  • Ковзайте фільтром(ами) параметрів по входу
  • У кожній позиції виконуйте згортку
  • Результуюча карта ознак:
    • Зберігає просторові шаблони з входу
    • Має менше параметрів, ніж лінійний шар
  • Один фільтр = одна карта ознак
  • Застосуйте активації до карт ознак
  • Усі карти ознак разом формують вихід
  • nn.Conv2d(3, 32, kernel_size=3)
Середній рівень Deep Learning з PyTorch

Згортка

Дві матриці 3×3 перемножуються поелементно, після чого всі числа в отриманій матриці підсумовуються.

  1. Обчисліть скалярний добуток вікна входу й фільтра
    • Ліве верхнє поле: 2 × 1 = 2
  2. Підсумуйте результат
Середній рівень Deep Learning з PyTorch

Нульове доповнення (zero-padding)

Зображення 4×4, оточене рамкою з нульових пікселів.

  • Додайте рамки з нулів до входу згорткового шару
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • Зберігає просторові розміри вхідного й вихідного тензорів
  • Гарантує рівне трактування крайніх пікселів
Середній рівень Deep Learning з PyTorch

Max pooling

Матриця 4×4, де кожен квартал 2×2 має свій колір, після max pooling стає 2×2.

  • Ковзайте неперекривним вікном по входу
  • У кожній позиції залишайте лише максимум
  • Використовується після згорткових шарів для зменшення просторових розмірів
  • nn.MaxPool2d(kernel_size=2)
Середній рівень Deep Learning з PyTorch

Згорткова нейронна мережа

class Net(nn.Module):
    def __init__(self, num_classes):
        super().__init__()

self.feature_extractor = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), )
self.classifier = nn.Linear(64*16*16, num_classes)
def forward(self, x): x = self.feature_extractor(x) x = self.classifier(x) return x
  • feature_extractor: (згортка, активація, пулінг) — двічі, потім flatten
  • classifier: один лінійний шар
  • forward(): пропустіть вхідне зображення через екстрактор ознак і класифікатор
Середній рівень Deep Learning з PyTorch

Розмір виходу екстрактора ознак

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Схема: вхідні зображення форми 3×64×64 проходять через conv-шар, шар пулінгу, ще один conv-шар і ще один шар пулінгу.

Середній рівень Deep Learning з PyTorch

Розмір виходу екстрактора ознак

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Схема: вхідні зображення форми 3×64×64 проходять через conv-шар, шар пулінгу, ще один conv-шар і ще один шар пулінгу.

Середній рівень Deep Learning з PyTorch

Розмір виходу екстрактора ознак

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Схема: вхідні зображення форми 3×64×64 проходять через conv-шар, шар пулінгу, ще один conv-шар і ще один шар пулінгу.

Середній рівень Deep Learning з PyTorch

Розмір виходу екстрактора ознак

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Схема: вхідні зображення форми 3×64×64 проходять через conv-шар, шар пулінгу, ще один conv-шар і ще один шар пулінгу.

Середній рівень Deep Learning з PyTorch

Розмір виходу екстрактора ознак

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Схема: вхідні зображення форми 3×64×64 проходять через conv-шар, шар пулінгу, ще один conv-шар і ще один шар пулінгу.

Середній рівень Deep Learning з PyTorch

Давайте потренуємось!

Середній рівень Deep Learning з PyTorch

Preparing Video For Download...