انتقل إلى المحتوى الرئيسي

الوحدة 2 — الخطوة والحشو والمجال الاستقبالي

عرفنا في الوحدة السابقة أنّ المرشّح 3×3 ينزلق فوق الصورة. لكنّ الحركة نفسها تُخفي ثلاثة قرارات لم نناقشها بعد: بأيّ سرعة ينزلق (الخطوة)، وكيف نتعامل مع حدود الصورة (الحشو)، وأيّ منطقة من الدخل تؤثّر في خلية معيّنة من الخرج (المجال الاستقبالي). ويحكم هذه القرارات جميعًا معادلة صغيرة، حفظها يُوفّر ساعات من التخبّط.

من أين يأتي حجم الخرج

على دخل بحجم H×WH \times W ومرشّح بحجم K×KK \times K وحشو PP وخطوة SS، يُعطى ارتفاع الخرج بالصيغة:

Hout=H+2PKS+1H_{\text{out}} = \left\lfloor \frac{H + 2P - K}{S} \right\rfloor + 1

وتنطبق الصيغة نفسها على العرض. لنجرّبها على مثالنا في CIFAR-10 بدون حشو وبخطوة 1:

Hout=32+031+1=30H_{\text{out}} = \left\lfloor \frac{32 + 0 - 3}{1} \right\rfloor + 1 = 30

فقدت الصورة بكسلَين من كلّ ضلع، وأصبح خرجها 30×30. ولو كدّسنا عشر طبقات التفاف من هذا النوع، لتقلّصت الصورة إلى 12×12، وضاعت معها معلومات كثيرة نحتاجها. هنا يدخل الحشو المسرح.

same مقابل valid: قرار حقيقي وليس تفصيلًا

يوفّر Keras وضعَي حشو:

  • valid: لا حشو، وحجم الخرج يتبع الصيغة أعلاه. تنكمش الصورة بعد كلّ التفاف.
  • same: يُضاف حشو تلقائي بحيث يبقى الخرج بنفس حجم الدخل حين تكون الخطوة 1.
from tensorflow.keras import layers

x = layers.Conv2D(32, 3, padding="same", activation="relu")(dxel)
# دخل 32×32×3، خرج 32×32×32

يُضاف الحشو عادةً بأصفار على الحدود. الاختيار بينهما ليس أسلوبيًا:

  • إذا كانت الشبكة عميقة وتُقلّص الصورة عبر التجميع فقط (الوحدة 3)، فالحشو same يُبقي السيطرة الكاملة على الحجم في يد المصمّم.
  • إذا كانت الشبكة ضحلة أو المهمّة تركّز على المركز (مثل الأرقام في MNIST)، فالحشو valid كافٍ ويحرّر الشبكة من تعلّم أنماط الحدود المصطنعة.
الحشو ليس خيارًا حياديًا

البكسلات المُضافة بالحشو أصفارٌ اصطناعية لم توجد في الصورة الأصلية. الطبقة الأولى تتعلّم مرشّحات خاصّة بها لتتجاهلها، وهو معامل يُبذل بلا مقابل. الحشو التماثلي (reflect) الموجود في torch.nn.functional.pad يُنقص هذا التحيّز، لكنّه غير متاح مباشرة في Conv2D. إن كنت تعمل على مهمّة حسّاسة للحدود، خذ ذلك في الحسبان.

الخطوة تُقلّص وتُسرِع

الخطوة 1 تعني أنّ النافذة تنتقل بكسلًا واحدًا في كلّ مرّة. الخطوة 2 تعني أنّها تقفز بكسلَين، فينكمش الخرج إلى نصف الأبعاد تقريبًا. الخطوة 2 مع التفاف تشبه في وظيفتها تجميعًا أقصى (الوحدة 3) بحجم 2 وخطوة 2، لكنّها معمارية متعلّمة بدل عملية جامدة، وذلك ما يفضّله المصمّمون الحديثون. طُبِّق هذا في ResNet.

from tensorflow.keras import layers
# التفاف بخطوة 2: يُنصّف الأبعاد ويستبدل التجميع
x = layers.Conv2D(64, 3, strides=2, padding="same", activation="relu")(x)
# دخل 32×32×32، خرج 16×16×64

خُذ حذرك: مضاعفة عدد المرشّحات كلّما نصّفنا الأبعاد قاعدة عمليّة شائعة، تجعل عدد القيم الإجمالي في خرائط الميزات يبقى ثابتًا نسبيًا. تتبعها معماريات VGG وResNet كلّها.

المجال الاستقبالي: أيّ صورة يرى العصبون فعلًا

يسأل المجال الاستقبالي عن رقعة الدخل التي تؤثّر في خلية واحدة من خريطة ميزات في طبقة عميقة. طبقة التفاف 3×3 لها مجال استقبالي 3×3 على الطبقة السابقة، ومساحة أكبر على الدخل الأصلي.

الصيغة التكرارية بسيطة. إذا كان RlR_l المجال الاستقبالي عند الطبقة ll، وSlS_l الخطوة عند تلك الطبقة، وKlK_l حجم مرشّحها، وإن كان JlJ_l الجُمُلة التراكمية للخطوات إلى الطبقة ll، فإنّ:

Rl+1=Rl+(Kl+11)×JlR_{l+1} = R_l + (K_{l+1} - 1) \times J_l Jl+1=Jl×Sl+1J_{l+1} = J_l \times S_{l+1}

بدء التكرار: R0=1R_0 = 1، J0=1J_0 = 1.

لنطبّق على شبكة صغيرة: التفاف 3×3، ثم تجميع بخطوة 2، ثم التفاف 3×3، ثم تجميع بخطوة 2، ثم التفاف 3×3.

الطبقةKSRRJJ
البدء11
Conv 3×33131
Pool 2×22242
Conv 3×33182
Pool 2×222104
Conv 3×331184

خلية واحدة من الخريطة الأخيرة تنظر إلى رقعة 18×18 من الصورة الأصلية. عند دخل 32×32، هذه أكثر من نصف مساحة الصورة، وهو حجم كافٍ لالتقاط شكل أنبوب زجاجي مثلًا. لكنّ على 224×224 من ImageNet، فإنّ 18×18 صغيرة جدًّا، وهذا أحد أسباب اللجوء إلى شبكات أعمق أو إلى الالتفاف الموسَّع.

الالتفاف الموسَّع: الحصول على مجال استقبالي كبير بلا زيادة معاملات

الالتفاف الموسَّع (dilated convolution) يترك فجوات بين خلايا المرشّح. مرشّح 3×3 بمعامل توسيع d=2d = 2 ينظر إلى بكسل ثم يقفز بكسلًا ثم ينظر إلى الآخر، فيغطّي رقعة 5×5 وهو يحمل تسعة معاملات فقط:

x = layers.Conv2D(64, 3, dilation_rate=2, padding="same", activation="relu")(x)

تتراكم الفوائد سريعًا: طبقتان موسَّعتان بمعاملَي 1 و2 تصلان إلى مجال استقبالي يقارب طبقة واحدة بحجم 7×7. تُستخدم هذه الحيلة كثيرًا في التجزئة الدلالية للصور (WaveNet وDeepLab)، حيث نريد مجالًا واسعًا مع حفاظ على الدقّة المكانية. مضارّ هذه العملية: بعض البكسلات لا يراها أيّ مرشّح، مما ينتج نمطًا شبكيًا في خرائط الميزات إذا لم تُختَر معاملات التوسيع بعناية.

عملية على CIFAR-10

نعود إلى نموذجنا التجريبي، هذه المرّة مع تحكّم صريح بالأبعاد:

import tensorflow as tf
from tensorflow.keras import layers, models

modele = models.Sequential([
layers.Input(shape=(32, 32, 3)),
layers.Conv2D(32, 3, padding="same", activation="relu"), # 32×32×32
layers.Conv2D(32, 3, strides=2, padding="same", activation="relu"), # 16×16×32
layers.Conv2D(64, 3, padding="same", activation="relu"), # 16×16×64
layers.Conv2D(64, 3, strides=2, padding="same", activation="relu"), # 8×8×64
layers.Conv2D(128, 3, padding="same", activation="relu"), # 8×8×128
layers.GlobalAveragePooling2D(),
layers.Dense(10, activation="softmax"),
])

modele.compile(optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])

استبدلنا التجميع بالتفاف بخطوة 2، واستبدلنا Flatten تلوه طبقة كثيفة كبيرة بـGlobalAveragePooling2D (الوحدة التالية). الرقم النهائي للمعاملات: نحو 210000، وهو صغير بمقاييس الرؤية، ويكفي للوصول إلى دقّة 75 % على CIFAR-10 خلال 20 حقبة.

قاعدة لفحص شكل الشبكة سريعًا

عند بناء شبكة، اطبع modele.summary() بعد كلّ طبقة تُضيفها: أخطاء الأبعاد تُكتشف قبل الحصول على استثناء. القاعدة العامّة: كلّ طبقة تُقلّص الأبعاد يجب أن تُضاعف عمق القنوات، حتى يبقى الاستطاعة التمثيلية للطبقة ثابتة تقريبًا.

في الخلاصة

  • صيغة حجم الخرج (H+2PK)/S+1\lfloor (H + 2P - K)/S \rfloor + 1 تُتنبَّأ بشكل الشبكة بدل انتظار استثناء أبعاد.
  • الحشو same يحافظ على الحجم عند الخطوة 1، و**valid** يُقلّص الصورة بمقدار K1K - 1 في كلّ محور؛ الاختيار يخدم المعمارية، وليس ذوقًا شخصيًا.
  • الخطوة 2 تُنصّف الأبعاد وتضاعف الكفاءة، وتُفضَّل حديثًا على التجميع الأقصى لأنّها تحمل معاملات متعلَّمة.
  • المجال الاستقبالي ينمو مع العمق ومع الخطوات المتراكمة؛ ويوسّعه الالتفاف الموسَّع دون زيادة المعاملات، بشرط عدم إحداث نمط شبكي.

الوحدة التالية: التجميع وتقليل الأبعاد المكانية، حيث نُدقّق الفرق بين التجميع الأقصى والمتوسّط والالتفاف بخطوة 2، وأيّها يبقى ذا معنى مع المعماريات الحديثة.