وسوف نستمر في سلسلتي حول بناء شبكات العقود التصويرية التي ثورت مجال بصريات الحاسوب خلال العقدين الماضيين، حيث سنبني في المرة القادمة شبكة VGG من الشبكات التصويرية العميقة من الصفر باستخدام PyTorch. يمكنك رؤية المقالات السابقة في السلسلة على ملفي الشخصي، بالأساس LeNet5 و AlexNet.
كما قمنا من قبل، سننظر في هيكل الشبكة والمبادئ الخلفية ل VGG وكيف كانت النتائج في تلك الأثناء. سنبحث بعدها في قاعدة البيانات الخاصة بنا، CIFAR100، وسنحملها إلى برنامجنا باستخدام برنامج ذو كفاءة حافظية متوازية. بعدها، سننفذ شبكة VGG16 (الرقم يشير إلى عدد الطوابق، وهناك نسختان بالأساس: VGG16 و VGG19) من الصفر باستخدام PyTorch ومن ثم ندربها على قاعدة البيانات الخاصة بنا ونقوم بتقييمها على مجموعة الاختبار لرؤية كيف تعمل على البيانات الجديدة.
VGG
بناءً على عمل AlexNet، يركز VGG على جانب آخر مهم من شبكات الأعمال العصبية التقنية (الشبكات العصبية التقنية)، عمق. وقد طوره Simonyan و Zisserman. إنه عادةً يتكون من 16 طبقات من التصوير ولكن يمكن أيضًا توسيعه إلى 19 طبقات (لهذه الدوائرين المختلفين، VGG-16 و VGG-19). كل طبقات التصوير تكون من مرشحات 3×3. يمكنك أن تقرأ المزيد عن الشبكة في الوثيقة الرسمية الخاصة هنا هنا
VGG16 للبنية. مصدر
تحميل البيانات
قاعدة البيانات
قبل أن نبني النموذج، أحد الأمور الأكثر أهمية في أي مشروع لل机器学习 (Machine Learning) هو تحميل، تحليل، وتحضير المجموعة البياناتية. سنستخدم في هذه المقالة مجموعة CIFAR-100. تشابه هذه المجموعة مجموعة CIFAR-10، إلا أنها تحتوي على 100 فئة تشمل 600 صورة كل واحدة. هناك 500 صورة تدريبية و100 صورة تجارية لكل فئة. ال100 فئة في CIFAR-100 تتم تجميعها في 20 فئة عالية. كل صورة تأتي مع تصنيف “دقيق” (الفئة التي تختلف إليها) وتصنيف “تركيزي” (الفئة العالية التي تختلف إليها). سنستخدم هنا التصنيف “دقيق”. هذه هي قائمة الفئات في CIFAR-100:
قائمة الفئات لمجموعة CIFAR-100
تحميل المكتبات
سنعمل أساسًا بواسطة torch
(يستخدم لبناء النموذج والتدريب)، torchvision
(لتحميل/تحليل البيانات، وتحتوي على مجموعات وطرق لمعالجة تلك المجموعات في الرؤية الحاسوبية)، و numpy
(للتحميل الرياضي). سنحدد أيضًا متغيرًا device
حتى البرنامج يستطيع استخدام الGPU إذا كان متاحًا
تحميل البيانات
torchvision
هي مكتبة توفر وصول سهل إلى العديد من المجموعات الخاصة بالرؤية الحاسوبية وطرق لتجهيز هذه المجموعات بطريقة سهلة وغير معقدة
- نحن نعرف وظيفة
data_loader
تعود إلى البيانات التعلمية / التجريدية أو البيانات الاختبارية وفقاً للمعارف - نبدأ بتعريف المتغير
normalize
بمعدلات واسعاد القناة (الحمراء والأزرق والاخضر) في المجموعة. يمكن الحساب لها يدوياً ، ولكن يوجد أيضًا معلومات متاحة على الإنترنت. يستخدم هذا في المتغيرtransform
حيث نغير حجم البيانات ، نحو توانسيات ثم نormalizeها - إذا كان المتغير
test
صحيحًا ، نقوم بتحميل المجموعة الاختبارية للبيانات ونستعيدها بواسطة محركات البيانات (التي ستشرح أدناه) - في حالة عدم صحة
test
(سلوك الأفتراضي أيضًا) ، نقوم بتحميل المجموعة التعلمية ونقسمها عشوائيًا إلى مجموعة تعلمية ومجموعة للتجريد (0.9:0.1) - أخيرًا ، نستخدم محركات البيانات. قد لا تؤثر هذا على الأداء في حالة مجموعة صغيرة مثل CIFAR100 ، لكنه يمكن أن يؤدي إلى تأخير كبير في حالة مجموعات كبيرة وهو عامةً ما يعتبر ممارسة جيدة. تسمح محركات البيانات لنا بتتبع البيانات في مساويات وتحميل البيانات أثناء التتبع وليس كلها في البدء إلى ذاك
VGG16 من البداية
لبناء النموذج من البداية، يتوجب علينا أولاً فهم كيفية تشكيل التعريفات النموذجية في torch
وأنواع الطبقات المختلفة التي سنستخدمها هنا:
- كل نموذج مختصر يتوجب أن يتم تخصيصه من خلال القسم
nn.Module
لأنه يوفر بعض الوظائف الأساسية التي تساعد النموذج على التدريب. - ثانيًا، يوجد شيئان رئيسيان يتوجب علينا فعلهما. الأول، تعريف الأطبقات المختلفة لنموذجنا داخل ال関数
__init__
والتسلسل الذي سيتم تنفيذه على المدخل داخل ال関数forward
دعونا نتعريف الأنواع المختلفة للطبقات التي نستخدمها هنا:
nn.Conv2d
: هي الطبقات التصاعدية التي تقبل عدد القنوات المدخلة والخارجية كما تلو الحجم العام للمرشد. وتقبل أيضًا أي تسارد أو تعبئة إذا كنت تريد تطبيقهاnn.BatchNorm2d
: هذا التطبيق يطبق التنظيم الجماعي على خاتم الطبقة التصاعديةnn.ReLU
: هذه هي التفعيلات التي يتم تطبيقها على مختلف من الخاتمات في الشبكةnn.MaxPool2d
: هذا يطبق عملية البحث عن الأقصى على الخريطة الخاصة بالناموسية والحجم المعينnn.Dropout
: يستخدم لتطبيق التخفيف على الخريطة بمعدل معينnn.Linear
: هذه جميعًا طبقة متصلة بالكاملnn.Sequential
: هذا ليس في الحقيقة نوعًا من الطبقات ولكنه يساعد في تركيب مختلف العمليات التي تكون جزءًا من نفس الخطوة
وبواسطة هذه المعرفة، يمكننا الآن بناء نموذج VGG16 باستخدام الهندسة التي تظهر في الوثيقة:
VGG16 من الصفر
المادات الرئيسية
أحد الأجزاء المهمة لأي مشروع للآلات أو التعلم العميق هو تحسين المادات الفوقية. هنا، لن نقوم بتجربة قيم مختلفة لهذه لكن سيتوجب علينا تعريفهم من قبل. هذه تتضمن تعريف عدد المرات التدريبية، حجم المجموعات، معدل التعلم، والمصادفة مع المعالج الخاص
تعديل المادات الفوقية
التدريب
نحن حالياً جاهزون لتمرين نموذجنا. سنظر أولاً إلى كيفية تمرين نموذجنا في torch
ومن ثم ننظر إلى البرمجيات:
- لكل دورة، نتمرد على الصور والتسميات داخل
train_loader
ونحنل تلك الصور والتسميات إلى الGPU إذا كان متاحًا. يحدث هذا تلقائيًا - نستخدم نموذجنا للتنبؤ بالتسميات (
model(images)
)ومن ثم نحسب الخسارة بين التنبؤات والتسميات الحقيقية بواسطة ما نسميه معاً وعي خسارة (criterion(outputs, labels)
) - ومن ثم نستخدم تلك الخسارة للتغيير الأسي (
loss.backward
) وتحديث الوزنات (optimizer.step()
). ولكن تذكر أن تضع المعادات في صفر قبل كل تحديث. يتم ذلك باستخدامoptimizer.zero_grad()
- أيضًا في نهاية كل دورة نستخدم جهة تجريدنا لتحسين دقة نموذجنا. في هذه الحالة ، لا نحتاج إلى المعادات لذلك نستخدم
with torch.no_grad()
للتقييم السريع
الآن نحن نجمع كل هذا في البرمجيات التالية:
التمرين
يمكننا رؤية خريطة البرمجيات الأعلى كما يلي:
خسارات التمرين
تجربة
للتجربة، نستخدم نفس الشفرة البرمجية التي نستخدمها للتحقق ولكن مع test_loader
:
تجربة
باستخدام الشفرة العلائقية وتدريب النموذج لـ 20 مرات ، تمكننا من تحقيق دقة 75% في المجموعة الاختبارية.
الخلاصة
دعونا نختم ما فعلناه في هذه المقالة:
- بدأنا بفهم الهيكلية وأنواع الطبقات المختلفة في نموذج VGG-16
- ثم، قمنا بتحميل وتعديل المجموعة CIFAR100 باستخدام
torchvision
- ومن ثم، استخدمنا
PyTorch
لبناء نموذج VGG-16 من الصفر مع فهم أنواع مختلفة للطبقات المتوفرة فيtorch
- وأخيرًا، تم تدريب واختبار نموذجنا على مجموعة CIFAR100 وبدا أن النموذج يشتغل جيدًا على المجموعة الاختبارية بدقة 75%
العمل المستقبلي
من خلال هذه المقالة، ستحصل على تقدم جيد وتعلم باليد الحركية ولكن سوف تتعلم المزيد إذا قمت بتوسيع هذا ورؤية ما يمكنك فعله آخر:
- يمكنك تجربة استخدام مجموعات مختلفة. وإحدى هذه المجموعات هي CIFAR10 أو جزء من مجموعة ImageNet.
- يمكنك تجربة مختلف المادة خاصة ورؤية أفضل مزيج منهم للنموذج
- في النهاية يمكنك أن تجربة إضافة أو إزالة أطباق من المجموعة لرؤية تأثيرهم على قدرة النموذج. وأفضل بكثير من ذلك، قم ببناء نسخة VGG-19 من هذا النموذج.
Source:
https://www.digitalocean.com/community/tutorials/vgg-from-scratch-pytorch