Apprentissage par transfert avec des couches gelées
📚 This guide explains how to freeze YOLOv5 🚀 layers when transfer learning. Transfer learning is a useful way to quickly retrain a model on new data without having to retrain the entire network. Instead, part of the initial weights are frozen in place, and the rest of the weights are used to compute loss and are updated by the optimizer. This requires less resources than normal training and allows for faster training times, though it may also result in reductions to final trained accuracy.
Avant de commencer
Clone le repo et installe le fichier requirements.txt dans un fichier Python>=3.8.0 incluant PyTorch>=1.8. Les modèles et les ensembles de données se téléchargent automatiquement à partir de la dernièreversion de YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Geler l'épine dorsale
Toutes les couches qui correspondent à train.py freeze
dans train.py seront gelés en fixant leurs gradients à zéro avant le début de l'entraînement.
# Freeze
freeze = [f"model.{x}." for x in range(freeze)] # layers to freeze
for k, v in model.named_parameters():
v.requires_grad = True # train all layers
if any(x in k for x in freeze):
print(f"freezing {k}")
v.requires_grad = False
Pour voir la liste des noms de modules :
for k, v in model.named_parameters():
print(k)
"""Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""
En examinant l'architecture du modèle, nous pouvons voir que l'épine dorsale du modèle est constituée des couches 0 à 9 :
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C3, [128]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C3, [256]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 9, C3, [512]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C3, [1024]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv5 v6.0 head
head:
- [-1, 1, Conv, [512, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C3, [512, False]] # 13
- [-1, 1, Conv, [256, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C3, [256, False]] # 17 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 14], 1, Concat, [1]] # cat head P4
- [-1, 3, C3, [512, False]] # 20 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 3, C3, [1024, False]] # 23 (P5/32-large)
- [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)
nous pouvons donc définir la liste de gel pour qu'elle contienne tous les modules dont le nom contient 'model.0.' - 'model.9.' dans leur nom :
Geler toutes les couches
Pour geler le modèle complet à l'exception des couches de convolution de sortie finale dans Detect(), nous définissons la liste de gel pour qu'elle contienne tous les modules dont le nom contient 'model.0.' - 'model.23.' dans leur nom :
Résultats
Nous entraînons YOLOv5m on VOC sur les deux scénarios ci-dessus, ainsi qu'un modèle par défaut (pas de gel), à partir du modèle officiel COCO prétraîné. --weights yolov5m.pt
:
train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
Comparaison de la précision
The results show that freezing speeds up training, but reduces final accuracy slightly.
GPU Comparaison de l'utilisation
Il est intéressant de noter que plus le nombre de modules gelés est important, moins la mémoire de GPU est nécessaire pour l'apprentissage, et plus l'utilisation de GPU est faible. Cela indique que les grands modèles, ou les modèles formés à une taille d'image plus grande, peuvent bénéficier du gel afin de s'entraîner plus rapidement.
Environnements pris en charge
Ultralytics fournit une gamme d'environnements prêts à l'emploi, chacun étant préinstallé avec des dépendances essentielles telles que CUDACUDNN, Pythonet PyTorchpour lancer tes projets.
- Carnets de notes gratuits GPU:
- Google Cloud: Guide de démarrage rapide de GCP
- Amazon: Guide de démarrage rapide AWS
- Azure: Guide de démarrage rapide d'AzureML
- Docker: Guide de démarrage rapide de Docker
Statut du projet
Ce badge indique que tous les tests d'intégration continue (CI) de YOLOv5 GitHub Actions sont passés avec succès. Ces tests CI vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 sur différents aspects clés : entraînement, validation, inférence, exportation et benchmarks. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, avec des tests effectués toutes les 24 heures et à chaque nouveau commit.