Vai al contenuto

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:

python train.py --freeze 10

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:

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

Risultati dell'allenamento al congelamento mAP50

Risultati del training di congelamento mAP50-95

Risultati della tabella

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.

Formazione GPU Percentuale di memoria allocata

Formazione GPU percentuale di utilizzo della memoria

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.

Stato del progetto

YOLOv5 CI

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.

📅C reato 1 anno fa ✏️ Aggiornato 1 mese fa

Commenti