ML Atlas

07 · Architektury · 4 min czytania · Interaktywne · aktualizacja

Czym jest sieć konwolucyjna (CNN) i dlaczego tak dobrze rozpoznaje obrazy?

W skrócie

CNN to sieć zbudowana z warstw splotowych i poolingu, która składa obraz z hierarchii wzorców: od krawędzi, przez fragmenty, po całe obiekty.

Co to jest

Sieć konwolucyjna (CNN, convolutional neural network) to sieć neuronowa, której główne warstwy wykonują splot: małe, uczone filtry przesuwają się po obrazie i wykrywają lokalne wzorce. Kolejne warstwy łączą wzorce z poprzednich w coraz bardziej złożone, a na końcu zwykle stoi kilka warstw gęstych lub uśrednienie, które zamienia mapy cech na decyzję.

Typowy przepływ: obraz → [splot → ReLU → pooling] × kilka → spłaszczenie lub globalne uśrednienie → warstwa gęsta → softmax. Pierwsze warstwy uczą się krawędzi i plam koloru, środkowe — tekstur, łuków i rogów, głębokie — części obiektów (oko, koło, litera). To nie jest zaprogramowane; tak wychodzi z treningu, co widać, gdy wizualizuje się filtry i mapy aktywacji.

CNN od 2012 roku zdominowały widzenie komputerowe: klasyfikację, detekcję obiektów, segmentację, analizę obrazów medycznych. Dziś konkurują z nimi transformery wizyjne, ale sploty pozostają standardem tam, gdzie danych jest mniej lub liczy się szybkość.

Mechanizm — dlaczego tak działa

Siła CNN to wbudowane założenia o obrazach (tzw. indukcyjne obciążenie). Zwykła sieć gęsta traktuje 64 piksele jak 64 niezależne liczby — nie wie, które leżą obok siebie. Gdyby piksele losowo przemieszać (wszystkie obrazy tak samo), sieć gęsta nauczyłaby się równie dobrze. CNN zakłada co innego: sąsiednie piksele są powiązane (lokalność), a ten sam wzorzec może wystąpić w dowolnym miejscu (współdzielenie wag). Te założenia są prawdziwe dla zdjęć, więc sieć nie musi ich odkrywać z danych.

Drugim filarem jest hierarchia i rosnące pole recepcyjne. Neuron w pierwszej warstwie widzi okienko 3×3. Neuron w drugiej widzi 3×3 neuronów pierwszej, czyli 5×5 pikseli; po poolingu 2×2 pole rośnie jeszcze szybciej. Głębokie neurony „widzą” więc duże fragmenty obrazu, choć każda pojedyncza operacja jest lokalna. Złożony kształt powstaje jako kompozycja prostych — tak jak twarz składa się z oczu, a oko z łuków i plam.

Trzeci filar to odporność na przesunięcie. Splot przesuwa mapę cech razem z obrazem, a pooling i globalne uśrednienie na końcu sprawiają, że ostateczna decyzja niewiele zależy od tego, gdzie dokładnie leży obiekt. Ta odporność nie jest pełna — duże przesunięcia czy obroty nadal szkodzą, dlatego stosuje się augmentację danych.

Ograniczenia: CNN słabo modelują relacje między odległymi częściami obrazu (potrzebują wielu warstw, by je „zobaczyć”), są wrażliwe na tekstury (potrafią rozpoznawać kota po futrze, a nie po kształcie) i podatne na przykłady adwersarialne. Bardzo głębokie CNN uczą się dobrze dopiero z połączeniami rezydualnymi i normalizacją.

Na przykładzie

Na zbiorze Digits 8×8 (podział 75/25, stratyfikowany) porównaliśmy dwie sieci o podobnej liczbie parametrów, każdą trenowaną 60 epok optymalizatorem Adam, z trzema różnymi ziarnami losowymi. Sieć gęsta 64→64→10 ma 4810 parametrów. Mała CNN — splot 3×3 z 16 filtrami, max pooling 2×2, splot 3×3 z 32 filtrami, globalny max pooling i warstwa 32→10 — ma 5130 parametrów. Na zwykłym zbiorze testowym obie są dobre: sieć gęsta 97,3%, CNN 98,2–99,6%.

Różnica wychodzi, gdy przesuniemy obrazy testowe o jeden piksel w prawo. Dokładność sieci gęstej spada do 46–49%, a przy przesunięciu o 2 piksele do 13–16%, czyli niewiele powyżej zgadywania (10%). CNN po przesunięciu o 1 piksel ma 82–89%, a o 2 piksele 71–89%. Sieć gęsta nauczyła się „piksel 27 jasny = cecha zera”; CNN nauczyła się wzorców, które rozpozna także w innym miejscu. Dla skali: LeNet-5 (1998) miała około 60 tys. parametrów, AlexNet (2012) około 61 mln, VGG-16 około 138 mln, a ResNet-50 — dzięki blokom z wąskim gardłem — tylko 25,6 mln.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: jądro 3×3 przesuwa się po cyfrze 8×8 i tworzy mapę cech 6×6 (8×8 z paddingiem 1); dla zera jądro krawędzi pionowych daje wartości od −47 do 55, a najsilniejsza odpowiedź leży na lewym brzegu kreski.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • W PyTorch sieć składa się z nn.Conv2d, nn.ReLU, nn.MaxPool2d, nn.BatchNorm2d i na końcu nn.AdaptiveAvgPool2d(1) + nn.Linear.
  • Przy małej liczbie zdjęć nie trenuj od zera: weź wytrenowaną na ImageNet sieć z torchvision.models (np. resnet50(weights="IMAGENET1K_V2")) i dostrój ją (transfer learning).
  • Typowy wzorzec: gdy rozdzielczość maleje 2×, liczba kanałów rośnie 2× (64 → 128 → 256 → 512).
  • Augmentacja (torchvision.transforms: losowe kadrowanie, odbicia, zmiany jasności) jest niemal obowiązkowa — uczy odporności, której splot nie daje sam.
  • Częsty błąd: brak normalizacji wejścia tymi samymi średnimi i odchyleniami, z którymi trenowano gotowy model.

Najczęstsze pytania

Czym CNN różni się od zwykłej sieci gęstej?
Każdy neuron CNN patrzy tylko na mały fragment wejścia, a te same wagi są używane w każdym miejscu obrazu. Dzięki temu sieć ma rzędy wielkości mniej parametrów i rozpoznaje wzorce niezależnie od położenia, czego sieć gęsta musiałaby się uczyć osobno dla każdego miejsca.
Czy CNN są jeszcze potrzebne w erze transformerów?
Tak. Transformery wizyjne wygrywają przy bardzo dużych zbiorach danych, ale przy mniejszych danych, ograniczonym sprzęcie i zadaniach czasu rzeczywistego CNN często są lepsze lub tańsze. Wiele nowoczesnych architektur łączy oba podejścia.
Ile warstw powinna mieć CNN?
Dla obrazów 8×8 czy 28×28 wystarczą 2–4 warstwy splotowe. Dla zdjęć 224×224 standardem są dziesiątki warstw (ResNet-18, ResNet-50), ale wtedy zwykle korzysta się z gotowej architektury i wag.
Dlaczego CNN potrafią się mylić na lekko zmienionym obrazie?
Uczą się cech, które statystycznie pomagają, a nie koniecznie tych, którymi kieruje się człowiek — np. tekstury zamiast kształtu. Dlatego niewidoczne dla oka zaburzenia (przykłady adwersarialne) potrafią zmienić decyzję.

Źródła

  • LeCun, Bottou, Bengio, Haffner „Gradient-Based Learning Applied to Document Recognition”, Proceedings of the IEEE 86(11), 1998.
  • Krizhevsky, Sutskever, Hinton „ImageNet Classification with Deep Convolutional Neural Networks”, NeurIPS 2012.
  • Goodfellow, Bengio, Courville „Deep Learning”, MIT Press, 2016, rozdz. 9.
  • Zhang i in. „Dive into Deep Learning”, d2l.ai, rozdz. 7 i 8 („Modern Convolutional Neural Networks”).
  • Géron „Hands-On Machine Learning”, 3rd ed., 2022, rozdz. 14.

Zobacz też