محتويات الدورة

PyTorch / أسس الموتر والتدرج والوحدة / الدرس 5

مجموعات البيانات ومحملاتها وتجميع العينات

حدد العينة والدفعة صراحة مع الحفاظ على الهوية والتغطية وحدود التقسيم.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تنفيذ عقد Dataset صغير للوصول بالفهرسة.
  • شرح دفعات DataLoader وتجميعها وسياسة الدفعة الأخيرة.
  • إبقاء افتراضات العمال والسحب والمعالجة المسبقة ظاهرة.

تصف مجموعة البيانات الوصول للمشاهدات

توفر Dataset ذات الوصول بالفهرس عادة __len__ و__getitem__، ويعيد كل فهرس مشاهدة محددة واحدة. الفهرس آلية وصول، وليس بالضرورة هوية المشاهدة الدائمة. توفر IterableDataset بدلاً من ذلك تدفق اجتياز بمسؤوليات مختلفة للسحب والعمال. اختر الواجهة من مصدر البيانات بدلاً من تقليد مثال غير متعلق به. يستخدم المساق ثلاثة صفوف اصطناعية مقدمة داخل الذاكرة تماماً. ولا ينزل مجموعة بيانات أو يقرأ سجلات خاصة أو يبدأ خدمة خارجية. حدد ترتيب السمات ومعنى الهدف وقائمة التقسيم خارج المحمل نفسه.

يحدد عقد العينة ما تستطيع الدفعة فعله

تعيد Dataset التوضيحية خريطة تحتوي معرّفاً نصياً وموتر float64 على CPU ذا سمتين وهدفاً مفرداً يساوي مجموع السمتين المعطاتين. يعالج التجميع الافتراضي الموثق في DataLoader الخرائط بصورة تكرارية، ويكدس الموترات المتوافقة، ويحفظ المعلومات غير الموترية وفق قواعده. يصبح شكل x في الدفعة (B,2) وشكل y هو (B,). لا يمكن تكديس موترات مختلفة الأطوال ببساطة في دفعة مستطيلة دون سياسة أخرى. قد تحشو collate_fn مخصصة أو تجمع أو تبقي قائمة، لكن عليها تحديد الأطوال والأقنعة ومحاذاة الأهداف بدلاً من حذف معلومات بصمت.

python برنامج توضيحي للمعالج المركزي وفق وثائق PyTorch 2.14؛ لم تتوفر torch والخرج المتوقع مشتق
import torch
from torch.utils.data import Dataset, DataLoader
class TinyRows(Dataset):
    def __init__(self):
        self.rows = [("a",[1.0,2.0]),("b",[3.0,4.0]),("c",[5.0,6.0])]
    def __len__(self):
        return len(self.rows)
    def __getitem__(self, index):
        key, values = self.rows[index]
        return {"id":key, "x":torch.tensor(values,dtype=torch.float64,device="cpu"),
                "y":torch.tensor(sum(values),dtype=torch.float64,device="cpu")}
loader = DataLoader(TinyRows(),batch_size=2,shuffle=False,num_workers=0,drop_last=False)
for batch in loader:
    print(batch["id"],tuple(batch["x"].shape),batch["y"].tolist())
الناتج المتوقع
['a', 'b'] (2, 2) [3.0, 7.0]
['c'] (1, 2) [11.0]

يكدس التجميع الافتراضي الموترات المتساوية الشكل ويحفظ الهويات النصية في الدفعات؛ وتصغر الأخيرة لأن drop_last=False. لم ينفذ DataLoader.

تغير اختيارات الدفعات التغطية والترجيح

يثبت المحمل shuffle=False وnum_workers=0 وbatch_size=2 وdrop_last=False. ولذلك يصف دفعة صفين تتبعها دفعة صف واحد. قد يستبعد حذف الأخيرة مشاهدات ويغير مجتمع التدريب الفعلي للمهمة. يعطي متوسط متوسطات الدفعات كل دفعة وزناً متساوياً، خلاف ترجيح المشاهدات عندما تختلف الأحجام. يفحص المرافق هذا الحساب بقوائم عادية. احفظ الأعداد أو مجاميع البسط والمقام للمقياس المقصود، واختبر مجموعة طولها ليس مضاعفاً لحجم الدفعة.

python مثال مرافق حتمي بالمكتبة القياسية نُفذ فعلياً
ids = ["a","b","c"]
batches = [ids[start:start+2] for start in range(0,len(ids),2)]
recovered = [key for batch in batches for key in batch]
print("batches", batches)
print("coverage preserved", recovered == ids)
means, counts = [2.0,5.0], [2,1]
weighted = sum(mean*count for mean,count in zip(means,counts))/sum(counts)
print(f"sample-weighted mean={weighted:.1f}")
الناتج المتوقع
batches [['a', 'b'], ['c']]
coverage preserved True
sample-weighted mean=3.0

يفحص المرافق المنفذ تغطية تقسيم حتمي وترجيح دفعة أخيرة ناقصة؛ لا تجميع الموترات أو السحب أو سلوك العمال.

يضيف العمال والعشوائية حالة أخرى

قد يغير استخدام العمال حدود العمليات وافتراضات الترتيب ومعالجة الحالة العشوائية والموارد المستخدمة. قد تتكرر بيانات التدفق عبر العمال ما لم يصمم تقسيمها بصورة صحيحة. يستخدم المثال صفراً من العمال ودون خلط عمداً لتجنب مسائل التنفيذ هذه؛ ولا يختبر تعدد العمليات. يغير الخلط ترتيب العينات لكنه لا ينشئ تقسيماً صحيحاً للتدريب والتقييم. لائم تعويض الفقد أو التحجيم أو المفردات داخل حد التدريب المسموح فقط، ثم طبق الحالة الملائمة في كل مسار عينة. قد يتسرب تحويل داخل __getitem__ إذا حُسبت معلماته المتعلمة عالمياً قبله.

افحص دفعة قبل إضافة التدريب

افحص المعرّفات وأشكال الموترات وأنواعها ومحاذاة الأهداف والأطوال الصالحة والتعامل مع العينات المفقودة أو غير المدعومة. احفظ الهوية خلال التصفية وأي تجميع مخصص لربط التنبؤات بصورة صحيحة لاحقاً. يجب ألا تتحول إعادة ترتيب الإتمام إلى إعادة ترتيب مستقلة للوسوم. أدرج الفراغ والعنصر المفرد والأحجام غير المتساوية والأطوال المتغيرة بسياسات صريحة. يبقى برنامج الإطار توقعاً موثقاً غير منفذ لغياب torch. يفحص المرافق القوائم والحساب الموزون فقط؛ ولا يتحقق من طرائق Dataset أو default_collate أو الساحب أو العمال أو الذاكرة المثبتة أو أداء المحمل.

الأخطاء الشائعة وإصلاحها

اختفت الأمثلة الأخيرة من كل حقبة

لماذا يحدث؟
حذفت drop_last=True أو حلقة مخصصة الدفعة الجزئية الأخيرة.
كيف تصلحه؟
اختر سياسة التغطية المقصودة ووثقها.
كيف تتجنب تكراره؟
اختبر الأطوال غير المتساوية وصالح معرّفات المشاهدات.

تغير مقياس عند تغير حجم الدفعة وحده

لماذا يحدث؟
حُسب متوسط متوسطات الدفعات دون أعداد المشاهدات.
كيف تصلحه؟
اجمع البسط والمقام المقصودين عبر الدفعات.
كيف تتجنب تكراره؟
أدرج دفعة كاملة وأخرى جزئية في مثال حساب معلوم.

كرر العمال عينات تدفق

لماذا يحدث؟
اجتاز كل عامل التدفق نفسه دون تقسيم.
كيف تصلحه؟
استخدم سياسة تدفق مناسبة تراعي العمال في البيئة المدعومة.
كيف تتجنب تكراره؟
اختبر تغطية الهوية وتعدديتها لا الإنتاجية الكلية وحدها.

اختبر فهمك

1. لماذا شكل آخر دفعة x هو (1,2) لا (2,2)؟

اعرض الحل المشروح

توجد ثلاث مشاهدات وتحمل الدفعة اثنتين بحد أقصى. تحتفظ drop_last=False بالمشاهدة الباقية كدفعة واحدة ذات سمتين. يجب ألا تفقد محور الدفعة أو تكتسب نسخة مكررة لملء مستطيل فحسب.

2. متوسطا دفعتين اثنان وخمسة وعدداهما اثنان وواحد. ما متوسط المشاهدات؟

اعرض الحل المشروح

البسط 2*2+5*1=9 والعدد ثلاثة، فيكون المتوسط ثلاثة. يعطي متوسط المتوسطين 3.5 ويزيد وزن المفرد. صرح بوحدة المقياس؛ فمقياس يعطي الدفعات أوزاناً متساوية عمداً عقد آخر.

أهم ما تعلمته

  • عقد العينة وعقد الدفعة واجهتان مختلفتان.
  • تعتمد التغطية وترجيح المقياس على سياسة الدفعة الأخيرة.
  • لا تثبت سهولة المحمل صحة التقسيم أو دلالات العمال.

المراجع الرسمية