Skip to content

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 + fond
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, n_classes)
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,660
Parametres totaux: 18,945,604

requires_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é.

👉 Entraîner et suivre les courbes de perte


Junior TSAFACK – 12/09/2026