انتقل إلى المحتوى

نقل التعلم باستخدام الطبقات المجمدة

📚 يشرح هذا الدليل كيفية التجميد YOLOv5 🚀 طبقات عند نقل التعلم. يعد نقل التعلم طريقة مفيدة لإعادة تدريب نموذج بسرعة على بيانات جديدة دون الحاجة إلى إعادة تدريب الشبكة بالكامل. بدلا من ذلك ، يتم تجميد جزء من الأوزان الأولية في مكانها ، ويتم استخدام بقية الأوزان لحساب الخسارة ويتم تحديثها بواسطة المحسن. يتطلب هذا موارد أقل من التدريب العادي ويسمح بأوقات تدريب أسرع ، على الرغم من أنه قد يؤدي أيضا إلى تقليل دقة التدريب النهائي.

قبل البدء

استنساخ الريبو وتثبيت requirements.txt في ملف Python>=3.8.0 بيئة، بما في ذلك PyTorch>=1.8. يتم تنزيل النماذج ومجموعات البيانات تلقائيا من الأحدث YOLOv5 إطلاق سراح.

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

تجميد العمود الفقري

جميع الطبقات التي تطابق train.py freeze سيتم تجميد القائمة في train.py عن طريق ضبط تدرجاتها على الصفر قبل بدء التدريب.

# 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

للاطلاع على قائمة بأسماء الوحدات النمطية:

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

بالنظر إلى بنية النموذج ، يمكننا أن نرى أن العمود الفقري للنموذج هو الطبقات 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)

حتى نتمكن من تحديد قائمة التجميد لتحتوي على جميع الوحدات مع "model.0." - "model.9." في أسمائها:

python train.py --freeze 10

تجميد جميع الطبقات

لتجميد النموذج الكامل باستثناء طبقات الالتفاف الناتج النهائي في Detect() ، قمنا بتعيين قائمة التجميد لاحتواء جميع الوحدات النمطية مع "model.0." - "model.23." في أسمائها:

python train.py --freeze 24

النتائج

نقوم بتدريب YOLOv5m على المركبات العضوية المتطايرة على كلا السيناريوهين المذكورين أعلاه ، جنبا إلى جنب مع نموذج افتراضي (بدون تجميد) ، بدءا من COCO الرسمي المدرب مسبقا --weights yolov5m.pt:

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

مقارنة الدقة

تظهر النتائج أن التجميد يسرع التدريب ، لكنه يقلل من الدقة النهائية قليلا.

تجميد نتائج التدريب mAP50

تجميد نتائج التدريب mAP50-95

نتائج الجدول

مقارنة استخدام وحدة معالجة الرسومات

ومن المثير للاهتمام ، أنه كلما تم تجميد المزيد من الوحدات ، قلت الحاجة إلى ذاكرة GPU للتدريب ، وانخفض استخدام GPU. يشير هذا إلى أن النماذج الأكبر حجما ، أو النماذج المدربة على حجم الصورة الأكبر قد تستفيد من التجميد من أجل التدريب بشكل أسرع.

تدريب ذاكرة GPU النسبة المئوية المخصصة

تدريب النسبة المئوية لاستخدام ذاكرة GPU

البيئات المدعومة

Ultralytics يوفر مجموعة من البيئات الجاهزة للاستخدام ، كل منها مثبت مسبقا مع تبعيات أساسية مثل CUDA و CUDNN ، Pythonو PyTorch، لبدء مشاريعك.

حالة المشروع

YOLOv5 سي آي

تشير هذه الشارة إلى أن جميع YOLOv5 اجتياز اختبارات التكامل المستمر (CI) لإجراءات GitHub بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداءYOLOv5 عبر جوانب رئيسية مختلفة: التدريب ، والتحقق من الصحة ، والاستدلال ، والتصدير ، والمعايير. إنها تضمن التشغيل المتسق والموثوق به على macOS و Windows و Ubuntu ، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.



Created 2023-11-12, Updated 2024-06-10
Authors: glenn-jocher (7)

التعليقات