Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Cette série suit la **même discipline que 03** : *from scratch PUIS framework,
| [4.2 — ConvNet profonde : pourquoi les résiduelles](4.2-ConvNet-Profonde-Residuelles.ipynb) | 20 conv2d empilées nues (effondrement du gradient), skip naïf (gradient réparé mais passe avant qui dérive), bloc pré-norme (les deux réparés), même protocole transposé à 20 blocs d'attention, puis accuracy CIFAR-10 sur 3 graines | **Le skip-connection n'est pas un détail architectural** : c'est le mécanisme qui rend les réseaux profonds entraînables. **C'est le même bloc que l'attention pré-norme dans [3.4](../03-DeepLearning/3.4-Attention-Transformer-From-Scratch.ipynb)** | rapport de gradients `g_0/g_19` : `plain` 2,16e-08 contre `prenorm` 1,01 ; effondrement exponentiel en la profondeur (D = 4 → 28 : 1,47e-01 → 2,02e-12) ; `res_naif` répare le gradient mais `|h|` dérive d'un facteur 88 et la perte initiale monte à 17,4 au lieu de `ln 5` ; attention nue : rapport **plat** (0,92) alors que `|h|` est divisé par 2,1e+07 ; CIFAR-10 (5 classes, 3 graines) : `prenorm` 62,0 % ± 2,8 contre `plain` 34,0 % ± 10,0, soit +28,0 points pour un bruit de ±10,4 (rapport 2,7) |
| [4.2b — Lean : le gradient qui meurt, le gradient qui survit](4.2b-Lean-GradientFlow-Vanishing.ipynb) | Companion kernel `lean4-wsl` du lake `learning_theory_lean` : la paire plafond/plancher `c ^ n` (pile plain) vs `(1-c) ^ n` (pile résiduelle) `#check`ée depuis le lake, anti-triangulaire au pire cas `t = ±2/5`, ancres numériques `norm_num`, balayage en profondeur rejoué en `Float`, 3 exercices | **La mesure du 4.2 devient un théorème** : `abs_deriv_plainStack_le` majore, `abs_deriv_residualStack_ge` minore — le raccourci identité garantit un plancher géométrique là où la pile nue a un plafond qui s'effondre | table `boundTable 0.4 [5,10,15,20]` : `c^n` 0,010240 → 0,000000 contre `(1-c)^n` 0,077760 → 0,000037 ; à n = 24 le plancher résiduel tient encore à 5e-06 ; exécution 19 cellules kernel lean4-wsl, 0 erreur (See #13106) |
| [4.2c — Détection d'objets from scratch : la grille d'anchors](4.2c-Detection-Anchor-From-Scratch.ipynb) | Terrain synthétique contrôlé (1-3 objets, largeurs 14-44 px, ratios 0,35-2,9, bruit gaussien + blobs de fond), grille d'anchors 5 184 (3 tailles × 3 ratios, stride 4), IoU vectorisée + garde-fous, assignation 0,5/0,35 + zone d'ombre + meilleur anchor par GT forcé, échantillonnage 1:3, encode/decode (dx, dy, dw, dh), loss BCE + 2×SmoothL1, NMS gloutonne, mAP VOC07/VOC10 calculé à la main, ablation grille carrée, 3 exercices | **Le réseau ne devine pas des boîtes, il corrige des hypothèses** : la détection anchor-based réduit la localisation à une régression de petits décalages contre des priors géométriques — et l'ablation mesure que la diversité des ratios y est absorbée par l'assignation forcée et la plage log ±3 | aller-retour encode/decode à 7,63e-06 px près ; 1,2 % des anchors ≥ 0,5 (le déséquilibre que le 1:3 compense) ; AnchorNet 74 717 paramètres ; 12 époques en 79 s GPU, loss 13,1 → 1,12 ; mAP@0.5 (400 images / 817 GT) : VOC07 0,853 / VOC10 0,914 ; ablation : grille carrée 0,864/0,926 contre complète 0,853/0,914 — écart de l'ordre du point (See #16057) |
| [4.2f — Détection SOTA : fine-tuner torchvision](4.2f-Detection-SOTA-Torchvision.ipynb) | Le terrain exact du 4.2c (générateur et graines repris verbatim : mêmes images, mêmes 817 GT de validation), trois familles `torchvision.models.detection` fine-tunées (Faster R-CNN two-stage, RetinaNet one-stage anchors, FCOS anchor-free) via le pattern d'usine uniforme (`num_classes=2, weights=None, weights_backbone=ImageNet`, seuils 0,5/0,45 posés à la construction, `min_size=320` commun), gris → RGB, cibles xyxy/labels, `ap_voc` et matching glouton repris verbatim, comparatif final contre AnchorNet (nombres committés), 3 exercices | **Le pré-entraînement transfère hors domaine** : sur des images grises synthétiques jamais vues d'ImageNet, la moitié du budget du from scratch (1 000 img × 6 ép. contre 2 000 × 12) achète un mAP essentiellement complet — le vrai livrable est le pattern d'usine, vocabulaire de tout pipeline réel | Faster R-CNN 18,9 M · RetinaNet 32,2 M · FCOS 32,1 M paramètres (contre 75 k) ; mAP@0.5 sur les mêmes 400 images : 0,909/0,997 · 0,997/1,000 · 0,909/0,998 contre AnchorNet 0,853/0,914 ; latence 17,7-36,3 ms/img GPU ; fine-tuning 73 s / 109 s / 107 s (See #16057) |
| [4.3 — Transfer learning : réutiliser un ResNet18 pré-entraîné](4.3-TransferLearning-ResNet.ipynb) | Charger ResNet18 pré-entraîné ImageNet, greffer une tête (5 130 params), comparer gelé vs fine-tuné sur EuroSAT (Sentinel-2, 10 classes d'occupation du sol, 80+30 imgs/classe), 3 graines appariées + test de permutation des signes | **Le feature extractor pré-entraîné est réutilisable — et le prix de ne pas l'adapter se mesure** : le gelé fait déjà ~89 % ; le fine-tuné ajoute ~6 points, mais seulement avec un taux décroissant (à taux constants, l'optimiseur oscille et finit sous le gelé) | backbone gelé 11,18 M params (99,95 % du réseau) ; gelé 89,3 % ± 1,3 (5 130 params entraînés) vs fine-tuné 95,6 % ± 0,8 (Adam différencié 3e-4/3e-3, décroissance x0,3/époque, batch 64, 5 époques) ; écart apparié +6,2 pts sur 3 graines (rapport signal/bruit 3,2, p = 0,250 au test de permutation — plancher 0,125 à n = 3) |

## Prérequis
Expand All @@ -32,7 +33,7 @@ Cette série suit la **même discipline que 03** : *from scratch PUIS framework,
pip install numpy matplotlib torch torchvision pillow
```

L'entraînement des deux notebooks concernés (4.2 et 4.3) reste **borné CPU** (sous-ensemble CIFAR-10 pour 4.2 ; EuroSAT ~94 Mo au premier run pour 4.3 — cache partagé `~/.cache/coursia-datasets` ; < 10 min/notebook). Les seuils d'entraînement sont calibrés pour la démonstration pédagogique, pas pour la performance ImageNet — voir les notebooks pour les budgets exacts par époque et par taille de sous-ensemble. Mesure sur 4.2 : exécution complète des 48 cellules en 2 min 20 s sur CPU ; mesure sur 4.3 : exécution complète des 35 cellules en 6 min 29 s sur CPU (dont 4 min 45 s d'entraînements) ; mesure sur 4.2c : exécution complète des 33 cellules en 3 min 02 s sur GPU CUDA (dont 1 min 19 s d'entraînement principal + l'ablation), le même budget restant exécutable sur CPU en quelques dizaines de minutes.
L'entraînement des deux notebooks concernés (4.2 et 4.3) reste **borné CPU** (sous-ensemble CIFAR-10 pour 4.2 ; EuroSAT ~94 Mo au premier run pour 4.3 — cache partagé `~/.cache/coursia-datasets` ; < 10 min/notebook). Les seuils d'entraînement sont calibrés pour la démonstration pédagogique, pas pour la performance ImageNet — voir les notebooks pour les budgets exacts par époque et par taille de sous-ensemble. Mesure sur 4.2 : exécution complète des 48 cellules en 2 min 20 s sur CPU ; mesure sur 4.3 : exécution complète des 35 cellules en 6 min 29 s sur CPU (dont 4 min 45 s d'entraînements) ; mesure sur 4.2c : exécution complète des 33 cellules en 3 min 02 s sur GPU CUDA (dont 1 min 19 s d'entraînement principal + l'ablation), le même budget restant exécutable sur CPU en quelques dizaines de minutes ; mesure sur 4.2f : exécution complète des 30 cellules en 5 min 51 s sur GPU CUDA (dont 4 min 49 s de fine-tuning des trois familles + évaluation sur 400 images), CPU exécutable pour l'inférence mais l'entraînement passe en dizaines de minutes par modèle.

## Lien avec les autres séries

Expand All @@ -46,4 +47,10 @@ L'Epic #12422 *« Série Vision 04 (à décider) — Évolution des architecture
- 4.2 — [pourquoi la profondeur échoue sans résiduelles](4.2-ConvNet-Profonde-Residuelles.ipynb) (livré)
- 4.3 — [transfer learning ResNet](4.3-TransferLearning-ResNet.ipynb) (livré)

La famille **détection d'objets** poursuit sur l'Epic #16057 (même terrain, même protocole d'évaluation) :

- 4.2b — [Lean : le gradient qui meurt](4.2b-Lean-GradientFlow-Vanishing.ipynb), 4.2c — [la détection from scratch à la grille d'anchors](4.2c-Detection-Anchor-From-Scratch.ipynb) (livrés)
- 4.2d (anchor-free from scratch) et 4.2e (Focal Loss dédiée) en cours de livraison sur la même issue
- 4.2f — [la détection SOTA torchvision fine-tunée](4.2f-Detection-SOTA-Torchvision.ipynb) (livré — bloc B.1 de #16057) ; B.2 (parité `ultralytics` YOLO) reste à livrer

Chaque notebook est atomique (1 sujet vérifiable, < 3000 lignes, ≤ 15 fichiers), avec outputs commités (C.2) et ≥ 3 exercices par notebook (C.1, jamais `raise NotImplementedError`).
Loading