استئناف التدريب والتكرار
استأنف عملية تشغيل انقطعت من دون أي تغيير، وابدأ جولة جديدة بأوزان best.pt ومعدل تعلّم يُطبّق فعليًا، ثم قارن بين عمليات التشغيل جنبًا إلى جنب.
المشاريع الفعلية عبارة عن سلسلة من عمليات التدريب. تتوقف بعض العمليات في منتصف الطريق — بسبب إغلاق الحاسوب المحمول، أو انقطاع جلسة SSH، أو استعادة وحدة GPU سحابية مسبقًا — وإعادة التشغيل من الصفر تعني خسارة ساعات من العمل. وتنتهي عمليات أخرى، وينبغي أن تستند الجولة التالية إليها بدلًا من البدء مجددًا من COCO.
في هذا الدرس، ستوقف عملية تشغيل ثم تستأنفها، وتبدأ الجولة الثانية انطلاقًا من best.pt بمعدل تعلّم يُطبّق فعليًا، وتقارن جميع عمليات التشغيل في جدول واحد. وستتعلم أيضًا سلوكي resume اللذين يتسببان بهدوء في هدر وقت التشغيل.
عملي
اختر نوع التشغيل المناسب#

| الحالة | نوع التشغيل | نقطة البداية |
|---|---|---|
| انقطاع الكهرباء أو الاتصال، أو نفاد الذاكرة في منتصف العملية | استئناف | last.pt، مع حالة المحسّن وجدولته |
| انتهت العملية؛ توجد بيانات إضافية أو تصحيح للوسوم أو حاجة إلى تدريب أطول | بدء دافئ | best.pt كنموذج مدرّب مسبقًا |
إضافة فئات أو حذفها، أو تغيير كثير من الوسوم، أو حدوث تغيير كبير في imgsz | بدء من الصفر | yolo26n.pt |
مثال عملي: استئناف عملية تشغيل انقطعت#
يستعيد resume=True النموذج وحالة المحسّن وجدول معدل التعلّم وعداد العصور التدريبية من last.pt، ثم يواصل الخطة الأصلية:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptمخرجات فعلية لعملية تشغيل من 5 عصور تدريبية توقفت بعد العصر الثاني:
Resuming training runs/detect/pills_resume/weights/last.pt from epoch 3 to 5 total epochs
3/5 0G 1.232 2.393 0.005478 206 320: 100% 6/6 4.5s
4/5 0G 1.345 1.859 0.005833 208 320: 100% 6/6 4.5s
5/5 0G 1.31 1.625 0.005854 191 320: 100% 6/6 4.4s
3 epochs completed in 0.004 hours.from epoch 3 to 5 total epochs: استأنف التدريب تمامًا بعد آخر عصر محفوظ، مع الإبقاء على الهدف الأصلي.- لم تمرر
dataأوepochs؛ فقد أُخذت كل الوسيطات من نقطة التحقق. ويمكن تجاوز بعض إعدادات وقت التشغيل، مثلbatchوdeviceوworkers، عند الاستئناف؛ أما الإعدادات الأخرى فتُتجاهل مع تحذيرResume ignores ....
مثال عملي: بدء الجولة الثانية انطلاقًا من أوزان سابقة#
معظم تجارب «الجولة التالية» ليست استئنافًا، بل عمليات تشغيل جديدة تبدأ من آخر نموذج جيد لديك — أي تعلّم بالنقل اعتيادي ضمن مشروعك. استخدم معدل تعلّم أقل كي يحسّن النموذج ما تعلّمه بدلًا من إعادة التعلّم:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # بدء دافئ من الجولة الأولى
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # اضبطه صراحةً: يتجاهل optimizer="auto" قيمة lr0
lr0=0.0005, # أكثر اعتدالًا من القيمة 0.002 التي اختيرت تلقائيًا في الجولة الأولى
name="pills_v2_warm",
)يؤكد السجل تطبيق الإعداد: optimizer: AdamW(lr=0.0005, momentum=0.937). يتناول دليل الضبط الدقيق تجميد الطبقات والتدريب على مرحلتين؛ ويتناول دليل ضبط المعلمات الفائقة عمليات البحث الشاملة.
مثال عملي: مقارنة عمليات التشغيل#
سمِّ كل عملية تشغيل وفقًا لما تغيّر — pills_v2_warm وpills_v3_imgsz640 وpills_v4_edge_frames — ولا تستخدم مطلقًا train2 أو final. تنشئ كل عملية تشغيل ملف results.csv، لذا لا تتطلب المقارنة سوى بضعة أسطر:
from pathlib import Path
import pandas as pd
for csv in sorted(Path("runs/detect").glob("*/results.csv")):
df = pd.read_csv(csv)
best = df["metrics/mAP50-95(B)"].max()
print(f"{csv.parent.name:<14} epochs={len(df):<3} best mAP50-95={best:.3f}")pills_resume epochs=5 best mAP50-95=0.579
pills_v1 epochs=10 best mAP50-95=0.659
pills_v2_warm epochs=5 best mAP50-95=0.694رفعت خمس عصور تدريبية بالبدء الدافئ قيمة mAP50-95 من 0.659 إلى 0.694، بينما لم تتجاوز النتيجة 0.579 بعد خمس عصور تدريبية انطلاقًا من أوزان COCO (pills_resume). يحقق البدء الدافئ تقدمًا بتكلفة أقل — ما دامت الفئات والوسوم لم تتغير في هذه الأثناء. وبعد تنفيذ عدة عمليات تشغيل، تصبح أداة تتبّع التجارب استثمارًا مجديًا: إذ تسجّل Ultralytics Platform (انظر مقارنة عمليات التشغيل واختيار الأفضل)، أو تكاملات Comet وWeights & Biases، كل عملية تشغيل تلقائيًا.
اجعل تكلفة كل جولة منخفضة#
تجيب معظم الجولات عن سؤال واحد، مثل «هل أفادت الإطارات الجديدة؟». تساعدك هذه الوسيطات على الوصول إلى إجابات أسرع أثناء الاستكشاف:
| الوسيط | مثال | التأثير |
|---|---|---|
fraction | fraction=0.5 | يدرّب النموذج على النصف الأول من صور التدريب (مرتبة حسب اسم الملف). |
time | time=0.25 | يوقف التدريب بعد 0.25 ساعة، متجاوزًا epochs. |
patience | patience=10 | يوقف التدريب إذا لم يتحسن أداء التحقق لمدة 10 عصور تدريبية. |
imgsz | imgsz=320 | ربع عدد وحدات البكسل مقارنةً بحجم 640؛ ولا تقارن بين عمليات التشغيل إلا عند استخدام الحجم نفسه. |
cache | cache=True | يُبقي الصور المفكوكة الترميز في RAM لتسريع تحميلها في العصور التدريبية اللاحقة. |
غيّر شيئًا واحدًا في كل جولة، ثم أكّد نجاح الخيار الأفضل بعملية تشغيل بالحجم الكامل قبل نشره. وعندما تحتاج إلى البدء من الصفر، استخدم الاستدعاء نفسه مع الأوزان المدرّبة مسبقًا:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # العودة إلى الأوزان المدرّبة مسبقًا على COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")تجنّب هذه الأخطاء#
العَرَض: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead، يتبعه تشغيل جديد تمامًا — على مجموعة البيانات الافتراضية coco8 ما لم تمرّر data. السبب: لا يواصل resume=True إلا التشغيلات التي توقفت مبكرًا. الحل: أوقفه، وابدأ تشغيلًا جديدًا عمدًا انطلاقًا من best.pt.
العَرَض: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... السبب: يختار optimizer=auto الافتراضي معدل تعلم خاصًا به. الحل: اضبط optimizer صراحةً (مثل "AdamW" أو "SGD") كلما ضبطت lr0، وتحقق من سطر السجل optimizer:.
تؤدي إعادة التدريب باستخدام name="pills_v1" إلى الكتابة في pills_v1-2، ما يسهل الخلط بين التشغيلات لاحقًا. استخدم اسمًا جديدًا وواضحًا لكل تشغيل.
عرض الحل
إذا كان توقيت Ctrl+C صعبًا على جهاز سريع، فيمكن لـردّ النداء إيقاف التشغيل بعد الحقبة 2:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # مفهرس بدءًا من 0: أوقف التشغيل بعد حفظ الحقبة 2
raise KeyboardInterrupt
model = YOLO("yolo26n.pt")
model.add_callback("on_model_save", power_cut)
model.train(data="my_dataset/data.yaml", epochs=5, imgsz=320, name="pills_resume")yolo train resume=True model=runs/detect/pills_resume/weights/last.pt
python round2.py
python compare_runs.pypills_v2_warm has the best mAP50-95 (0.694 vs 0.659 for pills_v1), with the same
classes and labels, so round three warm-starts from pills_v2_warm/weights/best.pt.