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:
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:
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.
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.
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.
- Ücretsiz GPU Not Defterleri:
- Google Bulut: GCP Hızlı Başlangıç Kılavuzu
- Amazon: AWS Hızlı Başlangıç Kılavuzu
- Azure: AzureML Hızlı Başlangıç Kılavuzu
- Docker: Docker Hızlı Başlangıç Kılavuzu
Proje Durumu
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.