TNI+VO · Exercice de Programmation

EP09_03 — 🟡 Comptage des paramètres entraînables d’un CNN

9.10.3 EP09_03 🟡 Comptage des paramètres entraînables d’un CNN

Cet EP formalise le comptage des paramètres entraînables d’un CNN. Étant donné la description textuelle d’une petite architecture, composée de couches convolutives, de pooling et entièrement connectées, déterminez, pour chaque couche, le nombre de paramètres entraînables et le total du réseau.

L’architecture doit être interprétée séquentiellement : la sortie d’une couche convolutive devient l’entrée de la couche suivante compatible. Ainsi, le nombre de canaux produits par une couche CONV détermine le nombre de canaux d’entrée (cin) de la couche convolutive suivante.

Dans une couche convolutive, il est important de distinguer les canaux d’entrée et les canaux de sortie :

  • \(c_{in}\) (channels in) est le nombre de canaux qui entrent dans la couche. Une image en niveaux de gris possède \(c_{in}=1\), alors qu’une image RVB possède \(c_{in}=3\). Dans une couche convolutive intermédiaire, cin est généralement égal au nombre de canaux produits par la couche CONV précédente.
  • \(c_{out}\) (channels out) est le nombre de canaux produits par la couche. Il est égal au nombre de filtres utilisés. Par conséquent, si une couche possède 16 filtres, elle produit \(c_{out}=16\) canaux.

Par exemple, considérez la séquence :

CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 784 10 1

La première convolution reçoit une image avec un canal et produit 8 canaux. Après le pooling, la seconde convolution reçoit ces 8 canaux et produit 16 canaux. La couche POOL ne modifie pas le nombre de canaux, elle peut seulement réduire les dimensions spatiales. La couche FC reçoit le nombre d’entrées indiqué dans la description elle-même.

Chaque filtre convolutif possède des dimensions

\[ k_h \times k_w \times c_{in}. \]

Ainsi, une couche avec \(c_{out}\) filtres possède

\[ k_h \cdot k_w \cdot c_{in} \cdot c_{out} \]

poids. S’il y a un biais, on ajoute un paramètre pour chaque filtre, totalisant ainsi \(c_{out}\) paramètres supplémentaires.

Le point central de cet exercice est d’observer que la quantité de paramètres d’une couche convolutive ne dépend pas des dimensions spatiales (\(H \times W\)) de la carte de caractéristiques. Cela est dû au partage des poids : le même filtre est réutilisé à différentes positions de l’entrée.

9.10.3.1 📋 Directives d’implémentation

  1. Entrée : Lire l’entier \(L\) (nombre de couches de l’architecture, dans l’ordre où elles sont appliquées).

  2. Couches : Lire \(L\) lignes, chacune décrivant une couche dans l’un des trois formats :

    • CONV kh kw cin cout bias — couche convolutive avec un kernel \(k_h \times k_w\), \(c_{in}\) canaux d’entrée, \(c_{out}\) canaux de sortie et bias (0 ou 1), indiquant s’il y a un biais par filtre ;
    • POOL — couche de pooling (maximum ou moyen), qui ne possède pas de paramètres entraînables et préserve le nombre de canaux ;
    • FC in out bias — couche entièrement connectée avec in entrées, out sorties et bias (0 ou 1), indiquant s’il y a un biais par neurone.
  3. Cohérence entre les couches CONV : dans une séquence de couches convolutives, le cin d’une couche doit correspondre au cout de la couche convolutive précédente. Une couche POOL ne modifie pas ce nombre de canaux.

    Par exemple :

    CONV 3 3 1 8 1
    POOL
    CONV 3 3 8 16 1

    La première CONV produit 8 canaux, qui sont reçus par la seconde CONV. Par conséquent, dans la seconde couche, cin=8 et cout=16.

  4. Paramètres d’une couche CONV :

    Chacun des \(c_{out}\) filtres possède \(k_h \cdot k_w \cdot c_{in}\) poids. Par conséquent,

    \[ P_{\mathrm{CONV}} = k_h \cdot k_w \cdot c_{in} \cdot c_{out} + c_{out}\cdot\text{bias}. \]

  5. Paramètres d’une couche FC :

    \[ P_{\mathrm{FC}} = \text{in}\cdot\text{out} + \text{out}\cdot\text{bias}. \]

  6. Paramètres d’une couche POOL : toujours \(0\).

  7. Total du réseau : additionner les paramètres entraînables de toutes les couches.

  8. Sortie : Pour chaque couche, dans l’ordre de lecture, imprimer Camada i: P, où \(i\) commence à \(1\) et \(P\) est le nombre de paramètres de cette couche. À la fin, imprimer Total: T.

9.10.3.2 📐 Exemple pour comprendre cin et cout

Considérez la séquence :

CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1

Dans la première couche :

  • cin=1 : un canal entre ;
  • cout=8 : il existe 8 filtres et, par conséquent, 8 canaux sortent.

Chaque filtre possède

\[ 3\cdot3\cdot1=9 \]

poids. Comme il existe 8 filtres :

\[ 9\cdot8=72 \]

poids. Avec un biais par filtre :

\[ 72+8=80. \]

Dans la seconde couche :

  • cin=8 : les 8 canaux produits par la première CONV entrent ;
  • cout=16 : il existe 16 filtres et, par conséquent, 16 canaux sortent.

Chaque filtre possède

\[ 3\cdot3\cdot8=72 \]

poids. Comme il existe 16 filtres :

\[ 72\cdot16=1152 \]

poids. Avec 16 biais :

\[ 1152+16=1168. \]

Ainsi, les deux couches possèdent, respectivement, 80 et 1168 paramètres entraînables.

Observez que cout n’est pas \(cin\) multiplié par le nombre de filtres. Le nombre de filtres est exactement cout : chaque filtre combine tous les canaux d’entrée et produit un seul canal de sortie.

9.10.3.3 📌 Contraintes computationnelles

  • Indépendance de la dimension spatiale : l’entrée ne fournit pas \(H \times W\). Le comptage d’une couche CONV dépend uniquement de kh, kw, cin et cout.
  • Cohérence des canaux : pour deux couches CONV consécutives, le cin de la seconde doit être égal au cout de la première. Une couche POOL préserve le nombre de canaux.
  • bias toujours 0 ou 1 : multiplier directement le terme de biais par cette valeur.
  • Couches POOL sans arguments supplémentaires : la ligne contient uniquement le mot POOL.
  • Couches FC : le nombre d’entrées in est fourni explicitement. Il n’est pas nécessaire de calculer les dimensions spatiales produites par les couches précédentes.
  • Toutes les valeurs numériques d’entrée sont des entiers non négatifs.

9.10.3.4 🧠 Fondement théorique

Élément Rôle dans le comptage des paramètres
\(c_{in}\) Nombre de canaux reçus par la couche
\(c_{out}\) Nombre de filtres et, par conséquent, de canaux produits par la couche
Filtre convolutif Chaque filtre possède \(k_h \cdot k_w \cdot c_{in}\) poids et produit un canal de sortie
Partage des poids Le même filtre est réutilisé à différentes positions de l’entrée, rendant le comptage indépendant de \(H \times W\)
Biais Un seul paramètre supplémentaire par filtre (CONV) ou par neurone (FC)
Pooling Peut modifier \(H \times W\), mais ne possède pas de paramètres entraînables et préserve le nombre de canaux
Couche FC Possède un poids pour chaque combinaison entre entrée et neurone de sortie

9.10.3.5 🧩 Méthodes de morph.py pouvant aider

Cet exercice est purement arithmétique et n’utilise pas directement les fonctions de morph.py. Le comptage peut, cependant, être vérifié sur une architecture réelle implémentée en PyTorch via :

sum(p.numel() for p in modelo.parameters())

Cette expression comptabilise les paramètres du modèle, y compris les poids et les biais.

9.10.3.6 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(L\).
  • \(L\) lignes suivantes : description de chaque couche, au format CONV kh kw cin cout bias, POOL ou FC in out bias.

Sortie :

  • \(L\) lignes au format Camada i: P.
  • Dernière ligne : Total: T.

9.10.3.7 📌 Exemples

Entrée Sortie Observation
3
CONV 3 3 1 8 1
POOL
FC 1352 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 13530
Total: 13610
Réseau simple avec une convolution, pooling et couche de classification.
5
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 400 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 1168
Camada 4: 0
Camada 5: 4010
Total: 5258
Petit CNN avec deux convolutions, deux poolings et une couche entièrement connectée.
6
CONV 3 3 1 8 1
POOL
CONV 3 3 8 16 1
POOL
FC 256 32 1
FC 32 10 1
Camada 1: 80
Camada 2: 0
Camada 3: 1168
Camada 4: 0
Camada 5: 8224
Camada 6: 330
Total: 9802
Petit CNN avec deux convolutions, pooling intermédiaire et deux couches entièrement connectées pour la classification.
🎮 Simulateur : Comptage des paramètres 🟡 partage des poids
CONV Bloc bleu POOL Cylindre vert FC Losange orange BATCH Pile rouge 🖱️ Faites glisser pour déplacer les couches
32×32
1
4
3
🧠 Visualisation 3D
🖱️ Faites glisser les couches | Molette zoom | P pause
Figure 9.45: Simulateur EP09_03 : Comptage de paramètres — Convolution vs. couche entièrement connectée
%%writefile EP09_03.py
# Code Python
Overwriting EP09_03.py
TestSuite("EP09_03.py").run()
✔️ EP09_03.cases existe déjà dans casos/
📋 3 cas chargé(s) depuis casos/EP09_03.cases

🔍 Test de Python : EP09_03.py
⚠️ EP09_03.py : fichier vide (moins de 3 lignes). Tests ignorés.