İçeriğe geç

Dondurulmuş katmanlarla transfer öğrenme

📚 Bu kılavuz, YOLOv5 🚀 katmanlarının ne zaman dondurulacağını açıklamaktadır transfer öğrenme. Transfer öğrenimi, tüm ağı yeniden eğitmek zorunda kalmadan bir modeli yeni veriler üzerinde hızlı bir şekilde yeniden eğitmenin yararlı bir yoludur. Bunun yerine, ilk ağırlıkların bir kısmı yerinde dondurulur ve ağırlıkların geri kalanı kaybı hesaplamak için kullanılır ve optimize edici tarafından güncellenir. Bu, normal eğitime göre daha az kaynak gerektirir ve daha hızlı eğitim süreleri sağlar, ancak aynı zamanda nihai eğitim doğruluğunda azalmalara neden olabilir.

Başlamadan Önce

Repoyu klonlayın ve requirements.txt dosyasını bir Python>=3.8.0 ortamı dahil olmak üzere PyTorch>=1.8. Modeller ve veri setleri en son YOLOv5 sürümünden otomatik olarak indirilir.

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

Omurgayı Dondur

train.py ile eşleşen tüm katmanlar freeze train.py'deki liste, eğitim başlamadan önce gradyanları sıfıra ayarlanarak dondurulacaktır.

# 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

Modül adlarının bir listesini görmek için:

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
"""

Model mimarisine baktığımızda, model omurgasının 0-9 katmanları olduğunu görebiliriz:

# 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)

böylece dondurma listesini adında 'model.0.' olan tüm modülleri içerecek şekilde tanımlayabiliriz. - 'model.9.' olan tüm modülleri içerecek şekilde tanımlayabiliriz:

python train.py --freeze 10

Tüm Katmanları Dondur

Detect() içindeki son çıktı konvolüsyon katmanları hariç tüm modeli dondurmak için, dondurma listesini adında 'model.0.' olan tüm modülleri içerecek şekilde ayarladık. - 'model.23.' içeren tüm modülleri içerecek şekilde ayarladık:

python train.py --freeze 24

Sonuçlar

YOLOv5m'yi, resmi COCO ön eğitiminden başlayarak varsayılan bir modelle (dondurma yok) birlikte yukarıdaki senaryoların her ikisinde de VOC üzerinde eğitiyoruz --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Doğruluk Karşılaştırması

Sonuçlar, dondurmanın eğitimi hızlandırdığını, ancak nihai doğruluğu biraz azalttığını göstermektedir.

Dondurma eğitimi mAP50 sonuçları

Dondurma eğitimi mAP50-95 sonuçları

Tablo sonuçları

GPU Kullanım Karşılaştırması

İlginç bir şekilde, ne kadar çok modül dondurulursa, eğitmek için o kadar az GPU bellek gerekir ve GPU kullanımı o kadar düşük olur. Bu, daha büyük modellerin veya daha büyük --image-size'da eğitilen modellerin daha hızlı eğitilmek için dondurma işleminden faydalanabileceğini göstermektedir.

Eğitim GPU ayrılan bellek yüzdesi

Eğitim GPU bellek kullanım yüzdesi

Desteklenen Ortamlar

Ultralytics gibi temel bağımlılıklarla önceden yüklenmiş bir dizi kullanıma hazır ortam sağlar. CUDA, CUDNN, Pythonve PyTorchProjelerinizi başlatmak için.

Proje Durumu

YOLOv5 CI

Bu rozet, tüm YOLOv5 GitHub Actions Sürekli Entegrasyon (CI) testlerinin başarıyla geçtiğini gösterir. Bu CI testleri, YOLOv5 'un işlevselliğini ve performansını çeşitli temel yönlerden titizlikle kontrol eder: eğitim, doğrulama, çıkarım, dışa aktarma ve kıyaslamalar. Her 24 saatte bir ve her yeni işlemde yapılan testlerle macOS, Windows ve Ubuntu üzerinde tutarlı ve güvenilir çalışma sağlarlar.

📅 1 yıl önce oluşturuldu ✏️ 1 ay önce güncellendi

Yorumlar