Konvoluční neuronové sítě

Intermediate Deep Learning with PyTorch

Michal Oleszak

Machine Learning Engineer

Proč nepoužívat lineární vrstvy?

Černý čtverec představující 256×256 obrázek ve stupních šedi.

Intermediate Deep Learning with PyTorch

Proč nepoužívat lineární vrstvy?

Obrázek ve stupních šedi 256×256 obsahuje přibližně 65 tisíc hodnot pixelů.

Intermediate Deep Learning with PyTorch

Proč nepoužívat lineární vrstvy?

Lineární vrstva s 1000 neurony zpracovává 65 tisíc hodnot pixelů.

Intermediate Deep Learning with PyTorch

Proč nepoužívat lineární vrstvy?

Mezi obrázkem a vrstvou je 65 milionů spojení.

Intermediate Deep Learning with PyTorch

Proč nepoužívat lineární vrstvy?

U barevného obrázku RGB je spojení 200 milionů.

Intermediate Deep Learning with PyTorch

Proč nepoužívat lineární vrstvy?

  • Lineární vrstvy:
    • Pomalý trénink
    • Přetrénování
    • Nerozpoznávají prostorové vzory
  • Lepší alternativa: konvoluční vrstvy!

Obrázek s kočkou v rohu a neurony zpracovávajícími tuto část snímku

Intermediate Deep Learning with PyTorch

Konvoluční vrstva

Filtr velikosti 3×3 se posouvá přes vstup velikosti 5×5 a vytváří příznakovou mapu velikosti 3×3.

  • Posuvný filtr(y) parametrů přes vstup
  • Na každé pozici se provede konvoluce
  • Výsledná příznaková mapa:
    • Zachovává prostorové vzory ze vstupu
    • Méně parametrů než lineární vrstva
  • Jeden filtr = jedna příznaková mapa
  • Aktivace aplikované na příznakové mapy
  • Všechny příznakové mapy tvoří výstup
  • nn.Conv2d(3, 32, kernel_size=3)
Intermediate Deep Learning with PyTorch

Konvoluce

Dvě matice 3×3 jsou vynásobeny prvek po prvku a výsledky jsou sečteny.

  1. Výpočet skalárního součinu vstupního výřezu a filtru
    • Levé horní pole: 2 × 1 = 2
  2. Součet výsledků
Intermediate Deep Learning with PyTorch

Nulové doplnění

Obrázek 4×4 obklopený rámem pixelů s hodnotou nula.

  • Přidá rámy nul ke vstupu konvoluční vrstvy
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • Zachovává prostorové rozměry vstupních a výstupních tenzorů
  • Zajišťuje, aby byly hraniční pixely zpracovávány stejně jako ostatní
Intermediate Deep Learning with PyTorch

Max Pooling

Matice 4×4, kde každý čtvrtletní blok 2×2 je označen jinou barvou, se po max poolingu stane maticí 2×2.

  • Posuvné nepřekrývající se okno přes vstup
  • Na každé pozici se zachová pouze maximální hodnota
  • Používá se za konvolučními vrstvami ke snížení prostorových rozměrů
  • nn.MaxPool2d(kernel_size=2)
Intermediate Deep Learning with PyTorch

Konvoluční neuronová síť

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: (konvoluce, aktivace, pooling), opakováno dvakrát a zploštěno
  • classifier: jedna lineární vrstva
  • forward(): průchod vstupního obrázku extraktorem příznaků a klasifikátorem
Intermediate Deep Learning with PyTorch

Výstupní velikost extraktoru příznaků

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)
`

Schématický diagram znázorňující průchod vstupních obrázků tvaru 3×64×64 konvoluční vrstvou, poolingovou vrstvou, další konvoluční vrstvou a další poolingovou vrstvou.

Intermediate Deep Learning with PyTorch

Výstupní velikost extraktoru příznaků

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)
`

Schématický diagram znázorňující průchod vstupních obrázků tvaru 3×64×64 konvoluční vrstvou, poolingovou vrstvou, další konvoluční vrstvou a další poolingovou vrstvou.

Intermediate Deep Learning with PyTorch

Výstupní velikost extraktoru příznaků

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)
`

Schématický diagram znázorňující průchod vstupních obrázků tvaru 3×64×64 konvoluční vrstvou, poolingovou vrstvou, další konvoluční vrstvou a další poolingovou vrstvou.

Intermediate Deep Learning with PyTorch

Výstupní velikost extraktoru příznaků

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)
`

Schématický diagram znázorňující průchod vstupních obrázků tvaru 3×64×64 konvoluční vrstvou, poolingovou vrstvou, další konvoluční vrstvou a další poolingovou vrstvou.

Intermediate Deep Learning with PyTorch

Výstupní velikost extraktoru příznaků

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)
`

Schématický diagram znázorňující průchod vstupních obrázků tvaru 3×64×64 konvoluční vrstvou, poolingovou vrstvou, další konvoluční vrstvou a další poolingovou vrstvou.

Intermediate Deep Learning with PyTorch

Pojďme si procvičit!

Intermediate Deep Learning with PyTorch

Preparing Video For Download...