تخطي إلى المحتوى

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

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

قبل أن تبدأ

استنساخ الريبو وتثبيت المتطلبات.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 على 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 MAP50-95

نتائج الجدول

GPU مقارنة الاستخدام

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

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

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

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

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

حالة المشروع

YOLOv5 CI

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

📅 تم إنشاؤها منذ 1 سنة مضت ✏️ تم التحديث منذ 1 شهر

التعليقات