Receptive Field
Il campo ricettivo è la porzione dell'immagine di input che può influenzare un'unità di una rete neurale. Scopri come cresce con profondità, stride e dilatazione, con codice.
Il campo recettivo di un'unità in una rete neurale convoluzionale (CNN) è la regione dell'immagine di input che può influenzarne il valore. Un'unità nel primo strato di convoluzione 3 × 3 della rete vede una porzione di pixel 3 × 3, mentre le unità degli strati più profondi vedono regioni progressivamente più ampie, perché ogni strato combina le uscite adiacenti dello strato precedente. Il campo recettivo determina quanto contesto può usare una caratteristica: un'unità che riconosce un autobus intero deve vedere l'intero autobus. Il termine deriva dalle neuroscienze, dove indica l'area del campo visivo che attiva un singolo neurone.
Come cresce il campo recettivo#
Ogni strato aggiunge (k − 1) × j pixel al campo recettivo, dove k è la dimensione del kernel e j, il passo, è la distanza in pixel di input tra unità adiacenti del suo input, pari al prodotto di tutti gli stride precedenti. Ne conseguono tre effetti:
- Sovrapposizione di kernel piccoli: tre strati 3 × 3 con stride 1 vedono una porzione 7 × 7, come un singolo strato 7 × 7, ma con 27C² pesi invece dei 49C² di C canali. Fu questo l'argomento a favore della costruzione di sequenze profonde di convoluzioni 3 × 3 usate dalle reti VGG.
- Stride e pooling: ogni strato con stride 2 o passaggio di pooling raddoppia il passo, quindi gli strati successivi ampliano il campo recettivo due volte più rapidamente. È così che le CNN raggiungono campi recettivi di centinaia di pixel riducendo al contempo le mappe di caratteristiche.
- Dilatazione: una convoluzione 3 × 3 dilatata (atrous) con dilatazione d distanzia i suoi punti di campionamento di d pixel e copre 2d + 1 pixel, ampliando il campo recettivo senza ridurre la risoluzione; è adatta alle attività dense per pixel, come la segmentazione semantica.
Misurare direttamente il campo recettivo conferma queste regole: esegui la backpropagation da un valore di output e verifica quali pixel di input ricevono un gradiente diverso da zero.
import torch
from torch import nn
# Three stacked 3x3 convolutions in three configurations: (stride, dilation)
for name, stride, dilation in (("plain", 1, 1), ("strided", 2, 1), ("dilated", 1, 2)):
convs = [nn.Conv2d(1, 1, 3, stride, padding=dilation, dilation=dilation, bias=False) for _ in range(3)]
for conv in convs:
nn.init.ones_(conv.weight) # positive weights, so no input pixel's gradient cancels out
layers = nn.Sequential(*convs)
# Backpropagate from the central output value; input pixels with nonzero gradient form its receptive field
image = torch.zeros(1, 1, 64, 64, requires_grad=True)
output = layers(image)
output[0, 0, output.shape[2] // 2, output.shape[3] // 2].backward()
rows = image.grad[0, 0].sum(dim=1).nonzero()
size = rows.max().item() - rows.min().item() + 1
print(f"{name}: {size}x{size} pixels")Stampa 7 × 7 per la sequenza semplice, 15 × 15 per quella con stride, in cui il passo cresce da 1 a 2 a 4, e 13 × 13 per la sequenza dilatata, in cui ogni strato aggiunge 4 pixel.
Campo recettivo teorico ed effettivo#
La formula dà il campo recettivo teorico, cioè tutti i pixel che possono influenzare un'unità. Il campo recettivo effettivo misura quanto contribuisce davvero ciascun pixel: la sua influenza ha una forma approssimativamente gaussiana, concentrata al centro, e occupa solo una parte dell'area teorica. I kernel più grandi lo ampliano; RepLKNet ha usato kernel depthwise fino a 31 × 31 e riportato campi recettivi effettivi molto più ampi rispetto alle CNN con kernel piccoli. Nei transformer per la visione, la self-attention consente a ogni patch dell'immagine di attingere a tutte le altre già dal primo strato, quindi il campo recettivo teorico copre l'intera immagine a ogni profondità.
Campo recettivo e termini correlati#
- Dimensione del kernel: la finestra che una convoluzione legge dal proprio input, ad esempio 3 × 3. Il campo recettivo è l'area accumulata nell'immagine originale; tre kernel 3 × 3 sovrapposti producono già un campo 7 × 7.
- Mappa di caratteristiche: la griglia di output di uno strato. Il campo recettivo descrive la regione di input corrispondente a una singola posizione della griglia.
- Finestra di contesto: il numero di token che un modello linguistico legge contemporaneamente, equivalente per le sequenze del campo recettivo su una griglia di immagini.
Campi recettivi nel rilevamento degli oggetti#
I rilevatori individuano gli oggetti piccoli usando mappe di caratteristiche fini e quelli grandi usando mappe grossolane e profonde con campi recettivi ampi; una rete piramidale di caratteristiche (FPN) riporta il contesto profondo nelle mappe fini. Un campo recettivo più piccolo dell'oggetto ne mostra solo una parte; gli oggetti minuscoli richiedono comunque un livello fine, perché su una mappa con stride 32 un oggetto di 20 pixel occupa meno di una cella della griglia. YOLO26 esegue le previsioni su mappe con stride 8, 16 e 32 e, alla fine del suo backbone, applica un blocco SPPF, che esegue il max pooling della mappa con stride 32 usando finestre equivalenti a celle 5 × 5, 9 × 9 e 13 × 13, seguito da un blocco di self-attention il cui raggio copre l'intera mappa con stride 32.










