أساسيات الشبكات العصبية الالتفافية
أضف طبقات Conv2D وMaxPooling لمهام تصنيف الصور
أساسيات الشبكات العصبية الالتفافية درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
لماذا نستخدم CNN للصور؟
تتعامل الشبكة الكثيفة مع وحدات البكسل بصورة مستقلة، فتفقد العلاقات المكانية بينها. تطبّق الشبكة العصبية الالتفافية (CNN) مرشحات قابلة للتعلّم تنزلق عبر المدخل، فتكتشف الأنماط المحلية مثل الحواف والأنسجة والأشكال بغض النظر عن موضعها. وتجعل اللامبالاة بالانتقال ومشاركة المعاملات شبكات CNN المعيار الذهبي لبيانات الصور.
library(keras)
# Images are 3D tensors: (height, width, channels)
# MNIST: (28, 28, 1) — grayscale
# CIFAR-10: (32, 32, 3) — RGB
# Reshape flat vectors into image tensors
mnist <- dataset_mnist()
x_train <- array_reshape(mnist$train$x / 255, c(-1, 28, 28, 1))
y_train <- to_categorical(mnist$train$y, 10)
cat('Input shape:', dim(x_train))layer_conv_2d() — الطبقة الأساسية
تطبّق layer_conv_2d(filters, kernel_size, activation) عدد filters من النوى ثنائية الأبعاد القابلة للتعلّم، بحجم kernel_size، على المدخل. ويتعلّم كل مرشح اكتشاف نوع واحد من الأنماط المكانية. ويكون شكل الناتج (height, width, filters).
library(keras)
# First conv layer: 32 filters of 3x3
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(
filters = 32,
kernel_size = c(3, 3),
activation = 'relu',
padding = 'same' # keep spatial dimensions
)
summary(model) # output: (None, 28, 28, 32)layer_max_pooling_2d()
تقلّل layer_max_pooling_2d(pool_size) الأبعاد المكانية من خلال أخذ القيمة العظمى في كل نافذة تجميع. ويحقق ذلك أمرين: تقليل عدد المعاملات في الطبقات اللاحقة، وإضفاء قدر من اللامبالاة بالانتقال (إذ لا تغيّر الإزاحات الصغيرة الناتج تغييراً كبيراً).
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, kernel_size = c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(pool_size = c(2, 2))
summary(model)
# After pooling: (None, 13, 13, 32)
# Spatial dims halved, channel count preservedتكديس طبقات Conv
تكدّس شبكات CNN الأعمق عدة كتل من Conv+Pool. تكتشف الطبقات المبكرة الميزات منخفضة المستوى (الحواف والتدرجات)، ثم تجمعها الطبقات الأعمق في ميزات عالية المستوى (الأشكال والكائنات). وتزيد كل طبقة Conv عدد المرشحات لتعويض تقلّص الأبعاد المكانية.
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |> # 16x16
layer_conv_2d(64, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |> # 8x8
layer_conv_2d(128, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) # 4x4
summary(model)layer_flatten()
تحوّل layer_flatten() الناتج ثلاثي الأبعاد لآخر كتلة التفافية (height, width, filters) إلى متجه أحادي الأبعاد. وتشكّل هذه الطبقة حلقة الوصل بين العمود الفقري لاستخراج الميزات (الطبقات الالتفافية) ورأس التصنيف (الطبقات الكثيفة).
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_conv_2d(64, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |> # 3D -> 1D vector
layer_dense(128, activation = 'relu') |>
layer_dense(10, activation = 'softmax')
summary(model)layer_dropout() في شبكات CNN
يُطبَّق الإسقاط العشوائي في شبكات CNN عادةً بعد طبقة التسطيح والطبقات الكثيفة، وليس داخل الكتل الالتفافية (حيث يُفضَّل الإسقاط العشوائي المكاني layer_spatial_dropout_2d()). ويُعد استخدام معدل يتراوح بين 0.25 و0.5 بعد الطبقة الكثيفة الأولى أمراً شائعاً.
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_conv_2d(64, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |>
layer_dense(128, activation = 'relu') |>
layer_dropout(rate = 0.5) |> # regularise the classifier head
layer_dense(10, activation = 'softmax')
summary(model)تجميع شبكة CNN وتدريبها
جمّع شبكة CNN ودرّبها كما تفعل مع الشبكة الكثيفة. في التصنيف متعدد الفئات باستخدام تسميات one-hot، استخدم 'categorical_crossentropy'؛ أما مع التسميات الصحيحة، فاستخدم 'sparse_categorical_crossentropy'. وغالباً ما تستفيد شبكات CNN من معدل تعلّم أقل قليلاً من الشبكات الكثيفة.
model |> compile(
optimizer = optimizer_adam(learning_rate = 0.0005),
loss = 'categorical_crossentropy',
metrics = c('accuracy')
)
history <- model |> fit(
x = x_train,
y = y_train,
epochs = 10,
batch_size = 64,
validation_split = 0.1,
verbose = 1
)
plot(history)زيادة البيانات
غالباً ما يؤدي تدريب شبكات CNN على مجموعات بيانات صغيرة إلى فرط التخصيص. تعمل زيادة البيانات على توسيع مجموعة التدريب اصطناعياً من خلال تطبيق تحويلات عشوائية (القلب والتدوير والتكبير/التصغير) أثناء التدريب. وفي keras3، استخدم layer_random_flip() وlayer_random_rotation() كطبقات معالجة مسبقة داخل النموذج.
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
# Data augmentation layers (only active during training)
layer_random_flip('horizontal') |>
layer_random_rotation(factor = 0.1) |>
layer_random_zoom(height_factor = 0.1) |>
# CNN backbone
layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |>
layer_dense(10, activation = 'softmax')
summary(model)تقييم شبكة CNN
تعيد evaluate(model, x_test, y_test) خسارة الاختبار والدقة. ولإجراء تحليل أعمق، استخدم predict() للحصول على احتمالات الفئات، ثم أنشئ مصفوفة التباس أو احسب درجات F1 لكل فئة لفهم جوانب ضعف النموذج.
# Evaluate on test set
test_scores <- model |> evaluate(x_test, y_test, verbose = 0)
cat('Test accuracy:', test_scores['accuracy'])
# Get predicted classes
prob_matrix <- model |> predict(x_test)
pred_classes <- max.col(prob_matrix) - 1 # 0-indexed
true_classes <- mnist$test$y
# Confusion matrix
table(Predicted = pred_classes, True = true_classes)مفهوم التعلّم بالنقل
يتطلب تدريب شبكة CNN من الصفر مجموعات بيانات كبيرة. ويعيد التعلّم بالنقل استخدام طبقات استخراج الميزات المدرَّبة مسبقاً على ImageNet (مثل VGG وResNet وMobileNet)، ولا يدرّب سوى رأس تصنيف مخصص. في keras، حمّل قاعدة مدرَّبة مسبقاً باستخدام application_mobilenet_v2() وثبّت طبقاتها.
# Load MobileNetV2 pretrained on ImageNet
base_model <- application_mobilenet_v2(
weights = 'imagenet',
include_top = FALSE, # remove original classifier head
input_shape = c(224, 224, 3)
)
# Freeze pretrained weights
base_model$trainable <- FALSE
# Add custom classifier head
model <- keras_model(
inputs = base_model$input,
outputs = base_model$output |>
layer_global_average_pooling_2d() |>
layer_dense(128, activation = 'relu') |>
layer_dense(5, activation = 'softmax')
)الحشو والخطوات في Conv2D
هناك وسيطان مهمان في layer_conv_2d: يضيف padding = 'same' أصفاراً حول المدخل بحيث يحافظ الناتج على الحجم المكاني نفسه للمدخل؛ أما padding = 'valid' (الافتراضي) فيقلّل الأبعاد بمقدار kernel_size - 1. ويستبدل strides = c(2,2) التجميع الأقصى بتحريك المرشح بخطوات مقدارها 2.
# 'same' padding: output = input size
conv_same <- layer_conv_2d(filters = 32, kernel_size = c(3, 3),
padding = 'same')
# Strided convolution instead of pooling
conv_strided <- layer_conv_2d(filters = 64, kernel_size = c(3, 3),
strides = c(2, 2), # halves spatial dims
padding = 'same')
# Model using strides instead of max pooling
model2 <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3,3), strides = c(2,2), activation = 'relu',
padding = 'same') |>
layer_conv_2d(64, c(3,3), strides = c(2,2), activation = 'relu',
padding = 'same') |>
layer_flatten() |>
layer_dense(10, activation = 'softmax')
summary(model2)تحقق سريع
ما الغرض الأساسي من layer_max_pooling_2d(pool_size = c(2, 2)) في شبكة CNN؟
مراجعة شبكات CNN
أهم النقاط من أساسيات الشبكات العصبية الالتفافية:
- تستخدم شبكات CNN مجالات استقبال محلية ومشاركة للمعاملات لمعالجة الصور بكفاءة.
- تستخرج
layer_conv_2d(filters, kernel_size, activation)الميزات المكانية. - تقلّل
layer_max_pooling_2d(pool_size)الدقة المكانية وتوفّر اللامبالاة بالانتقال. - تصل
layer_flatten()بين العمود الفقري الالتفافي ورأس المصنّف الكثيف. - تعمل
layer_dropout(rate)على تنظيم رأس التصنيف. - تقلّل طبقات زيادة البيانات (مثل
layer_random_flip()وغيرها) فرط التخصيص. - يُعد التعلّم بالنقل باستخدام أعمدة فقارية مدرَّبة مسبقاً النهج العملي لمجموعات البيانات الصغيرة.
# Standard CNN architecture for image classification
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
layer_conv_2d(32, c(3,3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2,2)) |>
layer_conv_2d(64, c(3,3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2,2)) |>
layer_conv_2d(128, c(3,3), activation = 'relu', padding = 'same') |>
layer_flatten() |>
layer_dense(256, activation = 'relu') |>
layer_dropout(0.5) |>
layer_dense(num_classes, activation = 'softmax')
model |> compile('adam', 'categorical_crossentropy', 'accuracy')
summary(model)الأسئلة الشائعة
هل درس «أساسيات الشبكات العصبية الالتفافية» مجاني؟
نعم — نص درس «أساسيات الشبكات العصبية الالتفافية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «أساسيات الشبكات العصبية الالتفافية»؟
أضف طبقات Conv2D وMaxPooling لمهام تصنيف الصور تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أساسيات الشبكات العصبية الالتفافية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد Keras وTensorFlow في R
- بناء النماذج التسلسلية
- أساسيات الشبكات العصبية الالتفافية
- التدريب والتحقق ومنع فرط التكيّف