Module 2 — Pas, remplissage et champ récepteur
Le module 1 a introduit la convolution telle qu'on la calcule à la main : un filtre glisse d'une position à la fois, sans dépasser des bords. Ce régime est un cas particulier. En pratique, on choisit le pas — combien de pixels le filtre saute entre deux positions — et le remplissage — combien de zéros on ajoute autour de l'image pour préserver la taille. Ces deux paramètres, ajoutés à la profondeur du réseau, déterminent la géométrie de toutes les cartes de caractéristiques et la portion de l'image que « voit » chaque neurone final. Sur CIFAR-10, une image de 32 pixels de côté n'a pas de marge à gaspiller : le mauvais choix de remplissage fait fondre la carte à zéro avant la fin de l'architecture.
La formule qui prédit toute taille de sortie
Pour une entrée de côté , un filtre de côté , un remplissage ajouté de chaque côté et un pas , la taille de sortie est
La partie entière inférieure explique la plupart des erreurs d'un pixel. Sur une entrée de 32, un noyau 3x3, un pas 1 et (« valid »), . Avec (le remplissage nommé « same »), : la sortie garde exactement la taille de l'entrée. Avec et , , ce qui divise la résolution par deux — c'est le mécanisme du sous-échantillonnage strié, comparé au max au module 3.
def taille_sortie(H, k, s=1, p=0):
return (H + 2 * p - k) // s + 1
print(taille_sortie(32, 3, s=1, p=0)) # 30
print(taille_sortie(32, 3, s=1, p=1)) # 32
print(taille_sortie(32, 3, s=2, p=1)) # 16
print(taille_sortie(32, 5, s=1, p=0)) # 28
Ces quatre lignes, exécutées mentalement, remplacent la plupart des lectures de model.summary().
Same, valid et le calcul du remplissage
Les cadriciels exposent deux modes prédéfinis :
- valid : aucun remplissage, la sortie rétrécit selon .
- same : le remplissage est calculé pour que . Avec , on retrouve l'entrée. Avec , la sortie fait exactement la moitié.
Sur un noyau impair, Keras ajoute zéros de chaque côté. Sur un noyau pair — 4x4, 6x6 — la répartition devient asymétrique : un côté reçoit un zéro de plus que l'autre. C'est une raison suffisante pour préférer les noyaux impairs, indépendamment de toute autre considération.
from tensorflow.keras import layers
# same : conserve 32 x 32
c1 = layers.Conv2D(32, 3, strides=1, padding="same")
# valid : reduit a 30 x 30
c2 = layers.Conv2D(32, 3, strides=1, padding="valid")
# valid strie : divise par deux et rogne, 15 x 15
c3 = layers.Conv2D(32, 3, strides=2, padding="valid")
Le choix n'est pas anodin. valid répété une dizaine de fois sur une entrée 32x32 fait rétrécir la carte à 12x12 puis 4x4, ce qui limite drastiquement le nombre de couches empilables et concentre l'information sur une région centrale de l'image. same maintient la résolution et laisse la responsabilité du sous-échantillonnage à des couches dédiées, plus explicites.
Sur CIFAR-10, empiler trois Conv2D(padding="valid") avec noyau 3x3 donne successivement 30, 28, 26. Le classifieur final voit une région centrale de 26x26 et perd les bords, où se cachent souvent des indices utiles — la queue d'un animal, le contour d'un véhicule. Sur un jeu haute résolution, l'effet est négligeable ; sur des vignettes, il pèse.
Le champ récepteur, ce qu'un neurone voit vraiment
Le champ récepteur d'une activation, c'est l'ensemble des pixels de l'entrée dont elle dépend. C'est ce qui fixe la taille des motifs que la couche peut détecter, et sa croissance en fonction de la profondeur explique pourquoi il faut empiler.
Une seule couche 3x3 a un champ récepteur de 3x3. Deux couches 3x3 empilées ont un champ récepteur de 5x5 : chaque activation de la seconde couche voit 3x3 activations de la première, chacune dépendant d'une région 3x3 de l'entrée avec un décalage d'un pixel entre voisines, ce qui produit 5x5 pixels au total. Trois couches 3x3 empilées voient 7x7 pixels, quatre couches en voient 9x9, et ainsi de suite. La formule générale, pour couches de noyau à pas 1, est
Avec un pas à une couche donnée, le champ récepteur augmente ensuite plus vite, multiplié par à chaque couche postérieure. C'est ce qui explique qu'un réseau ait besoin de peu de couches après un premier sous-échantillonnage pour couvrir l'image entière : le champ récepteur explose.
| Couches empilées (3x3, pas 1) | Champ récepteur | Ce que ça peut détecter |
|---|---|---|
| 1 | 3x3 | contour, gradient local |
| 3 | 7x7 | coin, texture simple |
| 6 | 13x13 | partie d'objet, motif répété |
| 10 | 21x21 | objet complet dans CIFAR-10 |
Sur CIFAR-10 (32x32), un champ récepteur de 21x21 couvre les deux tiers de l'image, ce qui suffit à voir la plupart des objets ; au-delà, chaque activation « voit » l'image entière. C'est la contrainte structurelle qui fixe la profondeur minimale utile d'un CNN pour un jeu donné.
Pourquoi deux 3x3 valent mieux qu'un 5x5
Cette équivalence de champ récepteur, popularisée par VGG au module 5, mérite d'être comprise dès maintenant. Empiler deux couches 3x3 offre le même champ récepteur qu'une seule couche 5x5, mais :
- Moins de paramètres : deux fois contre , à nombre de canaux égal en entrée et en sortie.
- Plus de non-linéarité : une ReLU entre les deux 3x3 ajoute un pli non linéaire là où le 5x5 n'en offre qu'un seul.
C'est la première fois qu'un choix de conception démontre qu'empiler des petits filtres bat un gros filtre équivalent. Cette leçon guide toutes les architectures postérieures à VGG.
Convolutions dilatées, ou comment gonfler sans coût
Une convolution dilatée écarte les prises du filtre au lieu d'agrandir le filtre lui-même. Un noyau 3x3 dilaté de facteur prend ses valeurs aux positions espacées de 2, ce qui donne un champ récepteur équivalent à un 5x5, avec les paramètres d'un 3x3. Empiler des dilatations croissantes — 1, 2, 4, 8 — permet d'obtenir un champ récepteur exponentiel sans jamais sous-échantillonner : c'est la base de la segmentation sémantique et de la reconnaissance vocale sur formes d'ondes brutes.
layers.Conv2D(32, 3, dilation_rate=2, padding="same") # RF equivalent 5x5
Les convolutions dilatées créent des trous dans le champ récepteur : deux activations voisines de la sortie peuvent s'appuyer sur des pixels très éloignés, ce qui produit des artefacts en damier. Utiliser des taux de dilatation qui n'ont pas de facteur commun autre que 1, ou alterner dilatations et convolutions ordinaires, atténue le problème.
En résumé
- La formule prédit toute taille de sortie ; l'apprendre par cœur évite la moitié des surprises d'un
summary. - same préserve la taille (avec ) ou la divise proprement (avec ) ; valid rogne les bords à chaque couche et concentre le classifieur au centre.
- Le champ récepteur croît linéairement avec la profondeur à pas 1, et se démultiplie à chaque pas 2 postérieur ; il fixe la profondeur minimale pour couvrir un objet.
- Deux 3x3 offrent le même champ récepteur qu'un 5x5 avec moins de paramètres et plus de non-linéarité — c'est la leçon qui prépare VGG au module 5.
Module suivant : le sous-échantillonnage, où se joue le compromis entre invariance à la translation et perte d'information spatiale.