Apprendimento per trasferimento con strati congelati
📚 Questa guida spiega come congelare i livelli di YOLOv5 🚀 durante l'apprendimento per trasferimento. L'apprendimento per trasferimento è un modo utile per riqualificare rapidamente un modello su nuovi dati senza dover riqualificare l'intera rete. Una parte dei pesi iniziali viene congelata e il resto dei pesi viene utilizzato per calcolare la perdita e aggiornato dall'ottimizzatore. Questo metodo richiede meno risorse rispetto alla formazione normale e consente tempi di formazione più rapidi, anche se può comportare una riduzione dell'accuratezza finale della formazione.
Prima di iniziare
Clona il repo e installa il file requirements.txt in un file di tipo Python>=3.8.0 con l'inclusione di PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimarelease di YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Blocca la spina dorsale
Tutti i livelli che corrispondono a train.py freeze
in train.py saranno congelati impostando i loro gradienti a zero prima dell'inizio della formazione.
# 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
Per vedere un elenco dei nomi dei moduli:
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
"""
Osservando l'architettura del modello, possiamo notare che la spina dorsale del modello è costituita dai livelli da 0 a 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)
così possiamo definire la lista freeze per contenere tutti i moduli con 'model.0.' - 'model.9.' nei loro nomi:
Congelare tutti i livelli
Per congelare l'intero modello ad eccezione dei livelli di convoluzione di uscita finali in Detect(), impostiamo la lista di congelamento in modo che contenga tutti i moduli con 'model.0.' - 'model.23.' nei loro nomi:
Risultati
Addestriamo YOLOv5m su VOC su entrambi gli scenari sopra descritti, insieme a un modello di default (senza congelamento), partendo dal pretraining ufficiale di COCO. --weights yolov5m.pt
:
train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
Confronto di precisione
I risultati mostrano che il congelamento accelera la formazione, ma riduce leggermente l'accuratezza finale.
GPU Confronto dell'utilizzo
È interessante notare che più moduli vengono congelati, meno memoria GPU è richiesta per l'addestramento e minore è l'utilizzo di GPU . Questo indica che i modelli più grandi o quelli addestrati con immagini di dimensioni maggiori possono trarre vantaggio dal congelamento per addestrarsi più velocemente.
Ambienti supportati
Ultralytics offre una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali, come ad esempio CUDA, CUDNN, Python, e PyTorchper dare il via ai tuoi progetti.
- Taccuini gratuiti GPU:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida di AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto
Questo badge indica che tutti i test di YOLOv5 GitHub Actions Continuous Integration (CI) sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.