Apprendimento per trasferimento con strati congelati
📚 Questa guida spiega come congelare YOLOv5 🚀 i livelli quando 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. Ciò richiede meno risorse rispetto all'addestramento normale e consente tempi di addestramento più rapidi, anche se può comportare una riduzione dell'accuratezza finale dell'addestramento.
Prima di iniziare
Clonare il repo e installare il file requirements.txt in un file 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
Congelare 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 dell'addestramento.
# 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 visualizzare 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 si può notare che la spina dorsale del modello è costituita dai livelli 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)
quindi possiamo definire la lista freeze per contenere tutti i moduli con 'model.0.' - 'model.9.' nel loro nome:
Congelare tutti i livelli
Per congelare l'intero modello, eccetto gli strati di convoluzione di uscita finali in Detect(), impostiamo la lista freeze per contenere tutti i moduli con 'model.0.' - 'model.23.' nel loro nome:
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 della precisione
I risultati mostrano che il congelamento accelera l'addestramento, ma riduce leggermente l'accuratezza finale.
GPU Confronto dell'utilizzo
È interessante notare che più moduli sono congelati, meno memoria GPU è richiesta per l'addestramento e più basso è l'utilizzo di GPU . Ciò indica che i modelli più grandi o quelli addestrati con immagini di dimensioni maggiori possono trarre vantaggio dal congelamento per addestrarsi più rapidamente.
Ambienti supportati
Ultralytics fornisce una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali quali CUDA, CUDNN, Python, e PyTorchper avviare i vostri progetti.
- Taccuini gratuiti GPU:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto
Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions 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.