Le fine-tuning ciblé
Remplacer uniquement la tête de classification
Section titled “Remplacer uniquement la tête de classification”Le RPN et le réseau qui l’accompagne (le backbone) ont déjà appris, sur COCO, à repérer des régions ressemblant à des objets — une compétence générale, transférable à peu près à n’importe quel domaine. Ce qui doit changer, c’est uniquement la partie qui décide quelle catégorie attribuer à chaque région :
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
n_classes = 4 + 1 # cercle, carre, triangle, etoile + fondin_features = model.roi_heads.box_predictor.cls_score.in_featuresmodel.roi_heads.box_predictor = FastRCNNPredictor(in_features, n_classes)Geler le backbone
Section titled “Geler le backbone”for p in model.backbone.parameters(): p.requires_grad = False
trainable_params = [p for p in model.parameters() if p.requires_grad]print("Parametres entrainables:", sum(p.numel() for p in trainable_params))print("Parametres totaux:", sum(p.numel() for p in model.parameters()))Parametres entrainables: 14,530,660Parametres totaux: 18,945,604requires_grad = False sur les paramètres du backbone les exclut du calcul de gradient : ils ne seront jamais mis à jour pendant l’entraînement. Environ 77 % des paramètres du modèle restent ainsi figés — seule la nouvelle tête de classification (23 % des paramètres) apprend à reconnaître nos 4 formes.
Pourquoi geler plutôt que tout réentraîner ?
Section titled “Pourquoi geler plutôt que tout réentraîner ?”- Moins de données nécessaires : réentraîner un backbone complet depuis les poids COCO demanderait des dizaines de milliers d’images pour ne pas perdre ses capacités générales de localisation. Ici, 200 images suffisent, car seule la tête (une petite partie du réseau) doit apprendre quelque chose de nouveau.
- Entraînement plus rapide : moins de paramètres à mettre à jour signifie moins de calcul par itération — déterminant pour un entraînement sur CPU.
- Risque de sur-apprentissage réduit : un backbone gelé ne peut pas mémoriser les particularités d’un petit jeu de données d’entraînement.
L’optimiseur ne voit que les paramètres entraînables
Section titled “L’optimiseur ne voit que les paramètres entraînables”optimizer = torch.optim.SGD(trainable_params, lr=0.005, momentum=0.9, weight_decay=0.0005)Construire l’optimiseur uniquement sur trainable_params (et non model.parameters()) garantit que le backbone gelé reste inchangé même si, par erreur, son gradient venait à être calculé.
Prochaine étape
Section titled “Prochaine étape”👉 Entraîner et suivre les courbes de perte
Junior TSAFACK – 12/09/2026