Vai al contenuto

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:

python train.py --freeze 10

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:

python train.py --freeze 24

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 la formazione, ma riduce leggermente l'accuratezza finale.

Risultati dell'allenamento al congelamento mAP50

Risultati del training di congelamento mAP50-95

Risultati della tabella

Confronto dell'utilizzo della GPU

È interessante notare che più moduli vengono congelati, meno memoria della GPU è richiesta per l'addestramento e minore è l'utilizzo della GPU. Ciò indica che i modelli più grandi o quelli addestrati con immagini di dimensioni maggiori possono trarre vantaggio dal congelamento per addestrarsi più velocemente.

Percentuale di memoria allocata della GPU di allenamento

Percentuale di utilizzo della memoria della GPU di allenamento

Ambienti supportati

Ultralytics offre una serie di ambienti pronti all'uso, ciascuno preinstallato con le dipendenze essenziali come CUDA, CUDNN, Python, e PyTorchper dare il via ai tuoi progetti.

Stato del progetto

YOLOv5 CI

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.



Creato 2023-11-12, Aggiornato 2024-01-14
Autori: glenn-jocher (4)

Commenti