معماريات CNN: الكلاسيكية → ResNet → ViT
“كاشفات الأنماط المحلية التي ترى الحواف ثم الملمس ثم الوجوه — بتراكم المرشحات”
الشبكات الالتفافية من الصفر: عملية الالتفاف والتجميع والحقل الاستقبالي، ثم الكلاسيكية وInception وResNet (الاتصالات القافزة) ومحول الرؤية ViT.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
الالتفاف
تمرير نواة K على المدخل I بحساب الضرب النقطي — تكتشف الأنماط المحلية
حجم الخرج
H=الارتفاع، k=حجم النواة، p=الحشو، s=الخطوة — يحدد الدقة المكانية للخرج
الاتصال القافز ResNet
الاتصال المتبقي: يُضيف المدخل مباشرةً للخرج — يحل مشكلة التدرج المتلاشي في العمق
▶محاكاة تفاعلية
⬡هندسة النموذج
لماذا تهم البنية المكانية
تسطيح صورة 224×224 إلى متجه يفقد جميع العلاقات المكانية — البكسل (0,0) ليس له علاقة خاصة بـ(0,1) في شبكة كثيفة. تستغل CNNs ثبات الترجمة: الفلتر الذي يكتشف حافة أفقية يعمل بنفس الطريقة سواء كانت الحافة في أعلى أو أسفل الصورة. هذا التشارك في الأوزان يقلل المعاملات بشكل جذري ويمنح CNNs تحيزها الاستنتاجي للرؤية.
تسلسل الميزات: من الحواف إلى الأشياء
كاشفات الطبقة 1: حواف موجهة وبقع لونية (فلاتر شبيهة بـGabor). الطبقة 2: قوام مبني من تركيبات الحواف. الطبقة 3: أجزاء الأجسام (عجلات، عيون، نوافذ). الطبقات الأخيرة: أجسام كاملة. هذا التسلسل وصّفه Zeiler و Fergus (2013) بـDeconvNets — يمكن رؤية ما 'تراه' كل طبقة بالحرف.
في CNN عميق بـ3 طبقات، كل خلية عصبية للمخرج لها حقل استقبال (k-1)·3+1 بكسل — مثال: ثلاث طبقات 3×3 تعطي حقلاً فعالاً 7×7، مطابق لـ7×7 لكن بمعاملات أقل وغير خطيات أكثر.
عملية الالتفاف
الالتفاف ثنائي الأبعاد يُمرر نواة K×K على المدخل محسوباً الضرب النقطي في كل موضع. مع C_in قنوات إدخال وC_out قنوات إخراج، لدينا C_in × C_out × K² معاملاً — أقل بكثير من طبقة متصلة بالكامل (H·W·C_in × H·W·C_out معاملاً).
ResNet: حل مشكلة التدهور
إضافة المزيد من الطبقات إلى CNN عادي لا يجب أن يضر (تعيين الهوية). لكن الشبكات العميقة جداً تدرّبت بشكل أسوأ. وجد He وآخرون (2015) السبب: صعوبة التحسين لا الإفراط. الاتصالات المتبقية تتيح للشبكة تعلم البواقي F(x) = H(x) - x بدلاً من H(x) مباشرة. إذا كانت الهوية هي التعيين الأمثل، تدفع الشبكة F(x) → 0. هذا يجعل تدريب 100+ طبقة ممكناً.
وصفة التدريب الحديثة (ResNet / EfficientNet)
التوسيع: RandomHorizontalFlip، RandomCrop، ColorJitter، MixUp/CutMix
البنية: استخدام الأوزان المُدرَّبة مسبقاً (ImageNet) — دائماً أفضل من التهيئة العشوائية
جدول إلغاء التجميد: تجميد العمود الفقري، تدريب الرأس لـ5 حقب، ثم إلغاء تجميد الكل
معدل التعلم: تضاؤل LR حسب الطبقة (الطبقات الأعمق = LR × 0.1 لكل كتلة)
التنظيم: Dropout قبل FC الأخير، weight decay 1e-4، label smoothing 0.1
المحسِّن: AdamW + CosineAnnealing مع إحماء
ضبط EfficientNet للتصنيف المخصص
import timm import torch.nn as nn import torch.optim as optim class="tok-comment"># ── Config ───────────────────────────────────────────────────────────── num_classes = class="tok-num">10 class="tok-comment"># e.g. class="tok-num">10-class image dataset class="tok-comment"># Load pretrained EfficientNet-B4 model = timm.create_model( class="tok-str">'efficientnet_b4', pretrained=True, num_classes=class="tok-num">0 class="tok-comment"># Remove classifier head ) class="tok-comment"># Freeze backbone initially for param in model.parameters(): param.requires_grad = False class="tok-comment"># Custom head classifier = nn.Sequential( nn.AdaptiveAvgPool2d(class="tok-num">1), nn.Flatten(), nn.BatchNorm1d(model.num_features), nn.Dropout(class="tok-num">0.4), nn.Linear(model.num_features, num_classes) ) class="tok-comment"># Stage class="tok-num">1: train head only (high LR) optimizer = optim.AdamW(classifier.parameters(), lr=class="tok-num">1e-3) class="tok-comment"># ... train for class="tok-num">5 epochs class="tok-comment"># Stage class="tok-num">2: unfreeze + fine-tune all (low LR) for param in model.parameters(): param.requires_grad = True optimizer = optim.AdamW([ {class="tok-str">'params': model.parameters(), class="tok-str">'lr': class="tok-num">1e-5}, {class="tok-str">'params': classifier.parameters(), class="tok-str">'lr': class="tok-num">1e-4} ])
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.