Kurs: sieci neuronowe od środka · Lekcja 10 z 12 · 14 min
Konwolucja: ten sam filtr w każdym miejscu
W skrócie
Jądro 3×3 sprawdza każde miejsce obrazu tymi samymi 9 wagami. Mapa cech, padding i współdzielenie wag: 80 liczb zamiast 2080, a na cyfrach 8×8 trafność podobna.
Rozgrzewka Dwa pytania z kursu ML, na których ta lekcja się opiera. Minuta, a lekcji nie blokuje.
MLP z lekcji 2 traktuje 64 piksele cyfry jak 64 osobne liczby. Każdy piksel ma własne wagi, a sieć nie wie, które piksele leżą obok siebie. Konwolucja (splot) działa inaczej. Małe jądro (filtr) 3×3 przesuwa się po obrazie. W każdym położeniu mnoży 9 pikseli przez te same 9 wag i sumuje. Wyniki składają się w mapę cech: obraz tego, gdzie jądro znalazło swój wzorzec.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Pokaż odpowiedź
Poprawna odpowiedź: Na lewym brzegu kreski, gdzie jasność rośnie w prawo
Na lewym brzegu kreski: 55. Cała mapa ma wartości od −47 do 55. Wartość ujemna znaczy, że jasność maleje w prawo, czyli prawy brzeg kreski. Środkowa kolumna jądra ma wagi 0, więc jasność samego piksela w środku okna nic nie zmienia.
Spróbuj
- Lab startuje na zerze z jądrem krawędzi pionowych. Najsilniejsza odpowiedź, 55, ma żółtą ramkę na obrazie i na mapie.
- Cel: wybierz cyfrę 7 i znajdź jądro, które najmocniej reaguje na jej poziomą kreskę.
- Przełącz padding. Bez niego mapa ma 6×6, bo okno 3×3 mieści się w 6 położeniach na 8 pikselach. Z paddingiem 1 obraz dostaje ramkę zer, a mapa ma 8×8.
Pomysł w prostych słowach
Jądro to mały wzorzec do szukania. Jądro krawędzi pionowych ma po lewej wagi −1, −2, −1, a po prawej 1, 2, 1. Gdzie po prawej jest jaśniej niż po lewej, wynik jest duży i dodatni. Gdzie obie strony są tak samo jasne, wynik to 0. To samo jądro sprawdza każde miejsce obrazu, więc znajdzie kreskę wszędzie, także tam, gdzie w treningu jej nie było.
W sieci splotowej (CNN) wag jądra nikt nie ustawia ręcznie. Sieć uczy się ich propagacją wsteczną, tak jak wag MLP. Warstwa ma kilka jąder: każde szuka innego wzorca i daje własną mapę.
Dlaczego to działa
Splot wbudowuje w sieć dwie właściwości obrazów. Piksele obok siebie są ze sobą powiązane, więc wystarczy małe okno. Ten sam wzorzec może być w dowolnym miejscu, więc jedno jądro obsługuje wszystkie miejsca. To współdzielenie wag: filtr 3×3 ma 9 wag i 1 wyraz wolny bez względu na rozmiar obrazu. 8 filtrów to 80 liczb. Warstwa gęsta 64 → 32 ma 64 · 32 + 32 = 2080.
Druga ilustracja uczy dwie sieci na tych samych cyfrach. MLP 64 → 32 → 10 ma 2410 wag. Sieć splotowa (8 filtrów 3×3, max pooling 2×2, warstwa 128 → 10) ma ich 1370. Po 15 epokach sieć splotowa rozpoznaje 97,2% cyfr testowych, a MLP 96,7%: różnica to 2 cyfry z 359. Na wyśrodkowanych cyfrach 8×8 splot nie bije MLP wyraźnie. Daje podobną trafność mniejszą liczbą wag.
Teraz przesuń cyfry testowe o 1 piksel w prawo. Sieć splotowa spada do 50,4%, MLP do 43,5%. Przy 2 pikselach obie są bliżej zgadywania (10%) niż dobrego wyniku: 15,0% i 18,4%. Filtr przesuwa mapę cech razem z cyfrą, ale warstwa gęsta na końcu ma osobną wagę dla każdego miejsca mapy. Sam splot daje więc tylko część odporności na przesunięcie.
Częsty błąd
Prawda czy fałsz: „Sieć splotowa ma osobną wagę dla każdego piksela, jak MLP.” Fałsz. Jeden filtr 3×3 ma 9 wag i 1 wyraz wolny i działa w każdym miejscu obrazu. 8 filtrów to 80 liczb, a warstwa gęsta 64 → 32 ma 2080. Cała sieć splotowa z ilustracji ma 1370 wag, MLP 2410. Na pięciu startach wag ich trafności różnią się o mniej niż 2 pkt proc. Przy cyfrach przesuniętych o 1 piksel sieć splotowa za każdym razem wyprzedza MLP o co najmniej 5 pkt proc., choć obie spadają poniżej 70%.
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Jądro 3×3 sprawdza każde miejsce obrazu tymi samymi 9 wagami i daje mapę cech.
- Współdzielenie wag: 8 filtrów 3×3 to 80 liczb, warstwa gęsta 64 → 32 to 2080.
- Padding 1 zachowuje rozmiar: mapa 8×8 zamiast 6×6.
- Na wyśrodkowanych cyfrach 8×8 sieć splotowa nie bije MLP wyraźnie. Oszczędza wagi i lepiej znosi przesunięcie o 1 piksel, ale też nie w pełni.
Głębiej: wzór, kod, praktyka
Matematyka
Splot w sieciach to formalnie korelacja, bez odwracania jądra: y[r, c] = b + Σₐ Σ_b k[a, b] · x[r + a, c + b], gdzie a, b = 0, 1, 2.
- Rozmiar mapy: obraz n × n, jądro k × k, padding p, krok 1, więc mapa ma
(n − k + 2p + 1) × (n − k + 2p + 1). Dla n = 8, k = 3, p = 0 to 6 × 6, dla p = 1 to 8 × 8. - Parametry warstwy splotowej:
F · (k² · C + 1)dla F filtrów i C kanałów wejścia. Dla F = 8, k = 3, C = 1 to 80. Warstwa gęsta:n_in · n_out + n_out, czyli 2080 dla 64 → 32. - Przesunięcie: obraz przesunięty o piksel daje mapę cech przesuniętą o piksel (poza brzegiem). Max pooling 2×2 bierze największą wartość z każdego okna 2×2, więc mapa 8×8 staje się 4×4.
W kodzie (Python)
Splot napisany od zera w numpy, na sztucznej kresce 8×8:
import numpy as np
def conv2d(img, k, pad=0):
# the same 3×3 kernel in every position (cross-correlation, as CNN layers compute it)
img = np.pad(img, pad)
n = img.shape[0] - 2
return np.array([[np.sum(img[r:r + 3, c:c + 3] * k) for c in range(n)] for r in range(n)])
img = np.zeros((8, 8))
img[1:7, 2:6] = [8, 16, 16, 8] # a vertical stroke, brighter in the middle
sobel = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) # vertical edges
m = conv2d(img, sobel)
print("map", m.shape, "values", m.min(), "to", m.max())
print("row 2 of the map:", m[2])
print("with padding 1:", conv2d(img, sobel, pad=1).shape)
moved = np.roll(img, 1, axis=1) # the stroke 1 pixel to the right
print("the map moves with the stroke:", np.array_equal(conv2d(moved, sobel)[:, 1:], m[:, :-1]))
print("8 filters 3x3:", 8 * (3 * 3 + 1), "numbers; dense 64 -> 32:", 64 * 32 + 32)
Wynik
map (6, 6) values -64.0 to 64.0
row 2 of the map: [ 32. 64. 32. -32. -64. -32.]
with padding 1: (8, 8)
the map moves with the stroke: True
8 filters 3x3: 80 numbers; dense 64 -> 32: 2080
Mapa jest dodatnia na lewym brzegu kreski i ujemna na prawym. Przesunięta kreska daje tę samą mapę przesuniętą o jedną kolumnę. Uruchomione w numpy 2.1.3.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- W każdej bibliotece warstwa splotowa ma cztery główne ustawienia: liczbę filtrów, rozmiar jądra, padding i krok. Rozmiar mapy policz wzorem z warstwy „Matematyka”, zanim zbudujesz sieć.
- Na małych, wyśrodkowanych obrazkach sprawdź też zwykły MLP albo regresję logistyczną. Splot nie musi wygrać.
- Odporność na przesunięcie dają dopiero razem: splot, pooling (także po całej mapie) i przesunięte przykłady w treningu.
- Przy prawdziwych zdjęciach zacznij od gotowej, wytrenowanej sieci splotowej i dostrój ją (transfer learning). Uczenie od zera wymaga dużo danych.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: