Jak obliczyć pola recepcyjne sieci konwolucyjnych - przewodnik
Źródło: Link
Źródło: Link
Pracujesz z sieciami konwolucyjnymi i zastanawiasz się, dlaczego model nie wykrywa dużych obiektów? Albo czemu analiza obrazu daje dziwne wyniki na brzegach? Problem może leżeć w polach recepcyjnych - i nie, to nie jest magia dostępna tylko dla doktorantów z Google Research.
Pole recepcyjne (receptive field) to obszar na obrazie wejściowym, który wpływa na konkretny neuron w sieci. Jeśli twoja sieć ma małe pole recepcyjne, nie zobaczy dużego obiektu. Jeśli za duże - straci szczegóły. Tu zaczyna się problem: większość ludzi liczy to na czuja albo wcale.
W tym przewodniku pokażę, jak precyzyjnie obliczyć pola recepcyjne dla nowoczesnych architektur CNN - w tym tych z wieloma ścieżkami (ResNet, Inception). Bez zgadywania, bez ręcznego rysowania diagramów.
Ten przewodnik zakłada, że:
Nie potrzebujesz zaawansowanej matematyki. Wzory są proste - pokażę je w formie, którą możesz od razu użyć.

Budujesz detektor samochodów. Twoja sieć analizuje obrazy 224×224 piksele. Liczysz warstwy, dodajesz konwolucje, wszystko działa... ale model nie wykrywa SUV-ów. Za to małe auta - bez problemu.
Sprawdzasz pole recepcyjne. Okazuje się, że wynosi 120 pikseli. SUV na twoim obrazie zajmuje 180 pikseli. Sieć fizycznie nie widzi całego obiektu - widzi fragmenty, ale nie całość. Stąd błędy.
To nie jest teoretyczny problem. Zespoły z Google Research (autorzy oryginalnej publikacji z 2019 roku) pokazali, że nieprawidłowe pole recepcyjne to częsta przyczyna słabych wyników w detekcji obiektów. Szczególnie gdy:
Jeśli nie liczysz pól recepcyjnych, strzelasz w ciemno. A to kosztuje - czas treningowy, GPU, nerwy.
Zacznijmy od najprostszego przypadku: sieć z jedną ścieżką (input → conv1 → conv2 → ... → output). Bez rozgałęzień, bez skip connections.
Dla każdej warstwy konwolucyjnej i poolingowej potrzebujesz trzech liczb:
Przykład: masz sieć z trzema warstwami conv:
Wzór dla każdej warstwy (licząc od końca sieci do początku):
ri = ri+1 + (ki - 1) × jumpi
Gdzie:
Dla ostatniej warstwy: r = 1 (pojedynczy piksel), jump = 1.
Weźmy sieć z kroku 1. Liczymy od tyłu:
Pole recepcyjne całej sieci: 17 pikseli. Każdy neuron w warstwie wyjściowej "widzi" obszar 17×17 pikseli z obrazu wejściowego.

ResNet, Inception, DenseNet - wszystkie mają rozgałęzienia. Dane idą kilkoma ścieżkami jednocześnie, a potem się łączą (concatenation lub addition). Jak tu liczyć pole recepcyjne?
Jeśli masz dwie ścieżki A i B, które łączą się w punkcie C:
Dlaczego maksimum? Bo neuron "widzi" tyle, ile widzi najszersza ścieżka. Jeśli jedna ścieżka ma r=50, a druga r=30, to neuron ma dostęp do obszaru 50 pikseli (nawet jeśli druga ścieżka widzi mniej).
Typowy blok ResNet ma:
Liczysz pole recepcyjne dla obu ścieżek osobno, potem bierzesz większą wartość. W praktyce skip connection często ma mniejsze pole (bo to tylko 1×1 conv lub identity), więc liczy się ścieżka główna.
Jeśli budujesz agenta AI z wizją komputerową, musisz wiedzieć, jak duże obiekty model potrafi "zobaczyć" - inaczej agent będzie gubił kontekst.
Ręczne liczenie działa, ale jest męczące. Zespół z Google Research (André Araujo, Wade Norris, Jack Sim) wypuścił w 2019 roku bibliotekę open-source do TensorFlow, która robi to automatycznie.
Zakładając, że masz model w TensorFlow/Keras:
Biblioteka radzi sobie z:
To oszczędza godziny debugowania. Zamiast zgadywać "czemu model nie widzi dużych obiektów", dostajesz konkretną liczbę: pole recepcyjne = 127 pikseli, a obiekt ma 200.
Jeśli dopiero zaczynasz przygodę z sieciami neuronowymi, zrozumienie jak działa backpropagation pomoże ci lepiej rozumieć, dlaczego architektura wpływa na wyniki.

Teoria to jedno, ale kiedy faktycznie potrzebujesz liczyć pola recepcyjne?
Budujesz detektor ludzi w tłumie. Masz osoby blisko kamery (duże) i daleko (małe). Jeśli pole recepcyjne jest za małe, model nie wykryje dużych osób. Jeśli za duże - straci małe.
Rozwiązanie: multi-scale detection. Liczysz pola recepcyjne dla różnych warstw sieci i wybierasz te, które pasują do rozmiarów obiektów.
Pobierasz ResNet-50 pretrenowany na ImageNet. Chcesz go użyć do analizy zdjęć satelitarnych. Problem: ImageNet ma obiekty ~100-300 pikseli, a twoje budynki zajmują 20-50 pikseli.
Liczysz pole recepcyjne ResNet-50. Okazuje się, że wynosi ~400 pikseli. To za dużo - model będzie "widział" zbyt szeroki kontekst i gubił małe budynki. Musisz zmodyfikować architekturę (mniejsze stride'y, mniejsze kernele w pierwszych warstwach).
Model działa świetnie na zbiorze treningowym, ale na produkcji daje losowe wyniki. Sprawdzasz obrazy - okazuje się, że w produkcji obiekty są większe niż w treningu. Pole recepcyjne jest za małe, model widzi tylko fragmenty.
Bez liczenia pól recepcyjnych możesz tracić tygodnie na szukanie błędu w danych, augmentacji, learning rate. A problem leży w architekturze.
Jeśli pracujesz z AI w marketingu, pola recepcyjne decydują, czy model rozpozna logo na banerze (małe) czy całą kompozycję reklamy (duża).
Nie zawsze. Jeśli dodajesz warstwy z małymi kernelami (1×1) i stride=1, pole recepcyjne rośnie minimalnie. Liczy się kombinacja kernel size i stride, nie liczba warstw.
Padding wpływa na rozmiar feature map, ale nie na pole recepcyjne (w podstawowym wzorze). W praktyce padding zmienia jednak, jak brzegi obrazu są przetwarzane. Jeśli masz obiekty na brzegach, padding ma znaczenie.
W sieciach z multi-scale detection (np. YOLO, SSD) potrzebujesz pól recepcyjnych dla kilku warstw jednocześnie. Nie wystarczy policzyć dla outputu - musisz wiedzieć, co widzi każda warstwa pośrednia.
Pole recepcyjne to obszar na obrazie wejściowym, który wpływa na neuron. Feature map to wyjście warstwy (może być 7×7, 14×14 itd.). To dwie różne rzeczy. Pole recepcyjne może być 200 pikseli, a feature map 7×7.
Masz trzy opcje:
Jeśli budujesz własne modele (a nie tylko używasz gotowych), liczenie pól recepcyjnych powinno być standardowym krokiem - tak jak sprawdzanie liczby parametrów czy czasu treningu. Inaczej strzelasz w ciemno i liczysz na szczęście.
A jeśli chcesz zrozumieć, jak tokenizacja w GPT i Claude wpływa na pole recepcyjne w modelach językowych (tak, tam też istnieje!), to temat na osobny artykuł.
Pola recepcyjne to tylko wierzchołek góry lodowej. Na darmowym webinarze pokazuję, jak budować, debugować i wdrażać modele AI - bez matematycznych fajerwerków, za to z konkretnymi przykładami.
Zapisz się na darmowy webinar →Wolisz uczyć się we własnym tempie? Sprawdź kurs AI Evolution
Pole recepcyjne to nie abstrakcyjna teoria - to konkretny parametr, który decyduje, czy twój model zobaczy cały obiekt, czy tylko fragment. Jeśli pracujesz z detekcją obiektów, segmentacją, analizą obrazów medycznych - musisz to liczyć.
Wzór jest prosty: r = r_poprzednie + (kernel - 1) × jump. Dla sieci z rozgałęzieniami bierzesz maksimum z wszystkich ścieżek. Jeśli nie chcesz liczyć ręcznie, są biblioteki (TensorFlow ma oficjalną).
Jeden krok na start: Otwórz architekturę swojego modelu (jeśli masz). Wypisz kernel size i stride dla pierwszych trzech warstw. Policz pole recepcyjne ręcznie (10 minut). Sprawdź, czy pasuje do rozmiarów obiektów w twoich danych. Jeśli nie - wiesz, co trzeba zmienić.
Nie bezpośrednio. Transformery nie mają klasycznych warstw konwolucyjnych, więc pole recepcyjne liczy się inaczej (zależy od rozmiaru patchy i liczby warstw attention). Dla ViT pole recepcyjne teoretycznie obejmuje cały obraz od pierwszej warstwy, ale efektywne pole (to, co model faktycznie wykorzystuje) jest mniejsze i wymaga osobnej analizy.
Zależy od rozmiaru obiektów w pikselach. Zasada: pole recepcyjne powinno być co najmniej 1.5-2× większe niż największy obiekt, który chcesz wykryć. Jeśli obiekty mają 100 pikseli, celuj w pole ~150-200. Jeśli masz obiekty różnej skali, potrzebujesz multi-scale detection (różne warstwy z różnymi polami).
Tak. W dilated conv (atrous conv) kernel size efektywnie rośnie o współczynnik dilation. Jeśli masz kernel 3×3 z dilation=2, efektywny kernel to 5×5 (ale z dziurami). Wzór: k_efektywne = k + (k-1)×(dilation-1). Potem liczysz pole recepcyjne normalnie, podstawiając k_efektywne zamiast k.
Przed. Pole recepcyjne zależy tylko od architektury (kernel size, stride, padding), nie od wag. Jeśli pole jest za małe, trening nie pomoże - model fizycznie nie widzi całego obiektu. Liczysz to na etapie projektowania architektury, nie po fakcie.
Tak. Zwiększ stride w istniejących warstwach (ale to zmniejszy rozdzielczość feature map) lub użyj dilated convolutions (zwiększają pole bez utraty rozdzielczości). Albo zwiększ kernel size (ale to zwiększa liczbę parametrów i koszt obliczeniowy). Każda opcja ma swoje kompromisy.
10 gotowych promptów do codziennej pracy + 5 narzędzi + plan na pierwszy tydzień. PDF, 4 strony konkretu.