🎯 أهداف الدرس
- فهم أساسيات TensorFlow وKeras والفرق بينهما
- بناء الشبكات العصبية العميقة من الصفر
- تطبيق الشبكات التحويلية (CNN) لمعالجة الصور
- تحسين أداء النماذج وتجنب فرط التدريب
- مشروع عملي: تصنيف الصور الطبية
🔍 ما هو TensorFlow وKeras؟
🚀 حقائق مذهلة:
- 85% من مشاريع التعلم العميق تستخدم TensorFlow
- Google وUber وAirbnb تعتمد على TensorFlow في الإنتاج
- أكثر من 180,000 مطور يساهمون في تطوير TensorFlow
- Keras أصبح جزءاً رسمياً من TensorFlow 2.0
TensorFlow هو مكتبة مفتوحة المصدر طورتها Google لبناء وتدريب نماذج التعلم الآلي والتعلم العميق.
بينما Keras هو واجهة برمجة تطبيقات عالية المستوى تجعل بناء الشبكات العصبية أسهل وأسرع.
الخاصية |
TensorFlow |
Keras |
مستوى التعقيد |
منخفض المستوى |
عالي المستوى |
سهولة الاستخدام |
معقد للمبتدئين |
سهل وبديهي |
المرونة |
مرونة كاملة |
مرونة محدودة |
سرعة التطوير |
بطيء |
سريع جداً |
🏗️ بناء أول شبكة عصبية
سنبدأ ببناء شبكة عصبية بسيطة لتصنيف الأرقام المكتوبة بخط اليد:
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# تحميل بيانات MNIST
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# معاينة البيانات
print(f"شكل بيانات التدريب: {x_train.shape}")
print(f"عدد الفئات: {len(np.unique(y_train))}")
# تطبيع البيانات (0-1)
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# بناء النموذج
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax')
])
# تجميع النموذج
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# عرض هيكل النموذج
model.summary()
Flatten Layer: يحول الصورة ثنائية الأبعاد (28×28) إلى مصفوفة أحادية البعد (784).
📚 أنواع الطبقات في Keras
نوع الطبقة |
الوظيفة |
الاستخدام |
Dense |
طبقة مكتملة الاتصال |
التصنيف والانحدار |
Conv2D |
طبقة تحويلية ثنائية الأبعاد |
معالجة الصور |
LSTM |
ذاكرة قصيرة طويلة المدى |
معالجة النصوص والتسلسلات |
Dropout |
منع فرط التدريب |
تحسين التعميم |
BatchNormalization |
تطبيع الدفعات |
تسريع التدريب |
🖼️ الشبكات التحويلية (CNN)
الشبكات التحويلية مصممة خصيصاً لمعالجة الصور وتحقق دقة عالية في التصنيف:
# بناء شبكة تحويلية لتصنيف الصور
cnn_model = keras.Sequential([
# الطبقة التحويلية الأولى
keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D((2, 2)),
# الطبقة التحويلية الثانية
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.MaxPooling2D((2, 2)),
# الطبقة التحويلية الثالثة
keras.layers.Conv2D(64, (3, 3), activation='relu'),
# تحويل إلى طبقات مكتملة الاتصال
keras.layers.Flatten(),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')
])
# تجميع النموذج
cnn_model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# إعادة تشكيل البيانات للشبكة التحويلية
x_train_cnn = x_train.reshape(-1, 28, 28, 1)
x_test_cnn = x_test.reshape(-1, 28, 28, 1)
# تدريب النموذج
history = cnn_model.fit(
x_train_cnn, y_train,
epochs=10,
batch_size=32,
validation_split=0.2,
verbose=1
)
🔍 مكونات الشبكة التحويلية:
- Conv2D: استخراج الميزات من الصور
- MaxPooling2D: تقليل حجم البيانات والحفاظ على الميزات المهمة
- Flatten: تحويل البيانات ثنائية الأبعاد إلى أحادية البعد
- Dense: طبقات التصنيف النهائية
📊 تقييم وتحسين النموذج
# تقييم النموذج
test_loss, test_accuracy = cnn_model.evaluate(x_test_cnn, y_test, verbose=0)
print(f"دقة النموذج على بيانات الاختبار: {test_accuracy:.4f}")
# رسم منحنيات التدريب
plt.figure(figsize=(12, 4))
# منحنى الدقة
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='دقة التدريب')
plt.plot(history.history['val_accuracy'], label='دقة التحقق')
plt.title('دقة النموذج')
plt.xlabel('العصر (Epoch)')
plt.ylabel('الدقة')
plt.legend()
# منحنى الخسارة
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='خسارة التدريب')
plt.plot(history.history['val_loss'], label='خسارة التحقق')
plt.title('خسارة النموذج')
plt.xlabel('العصر (Epoch)')
plt.ylabel('الخسارة')
plt.legend()
plt.tight_layout()
plt.show()
# التنبؤ على عينات جديدة
predictions = cnn_model.predict(x_test_cnn[:5])
predicted_classes = np.argmax(predictions, axis=1)
actual_classes = y_test[:5]
print("التنبؤات الأولى:")
for i in range(5):
print(f"الصورة {i+1}: متوقع={predicted_classes[i]}, فعلي={actual_classes[i]}")
إذا كانت دقة التدريب أعلى بكثير من دقة التحقق، فهذا يعني وجود فرط تدريب (Overfitting).
استخدم تقنيات مثل Dropout وData Augmentation لحل هذه المشكلة.
🏥 مشروع عملي شامل: تصنيف الصور الطبية
سنبني نظاماً لتصنيف الأشعة السينية للصدر لاكتشاف الالتهاب الرئوي:
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import VGG16
from tensorflow.keras.layers import GlobalAveragePooling2D, Dense
from tensorflow.keras.models import Model
# إعداد مولدات البيانات مع التحسين
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
zoom_range=0.2,
validation_split=0.2
)
# تحميل النموذج المدرب مسبقاً VGG16
base_model = VGG16(
weights='imagenet',
include_top=False,
input_shape=(224, 224, 3)
)
# تجميد طبقات النموذج الأساسي
base_model.trainable = False
# بناء النموذج المخصص
model = tf.keras.Sequential([
base_model,
GlobalAveragePooling2D(),
Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
Dense(1, activation='sigmoid') # تصنيف ثنائي
])
# تجميع النموذج
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
loss='binary_crossentropy',
metrics=['accuracy', 'precision', 'recall']
)
# عرض هيكل النموذج
model.summary()
# تدريب النموذج (محاكاة)
print("بدء تدريب نموذج تصنيف الأشعة السينية...")
print("العصر 1/20 - الخسارة: 0.6234 - الدقة: 0.7123")
print("العصر 5/20 - الخسارة: 0.4567 - الدقة: 0.8234")
print("العصر 10/20 - الخسارة: 0.3456 - الدقة: 0.8756")
print("العصر 15/20 - الخسارة: 0.2789 - الدقة: 0.9012")
print("العصر 20/20 - الخسارة: 0.2234 - الدقة: 0.9234")
print("
📊 نتائج التقييم النهائي:")
print("الدقة: 92.34%")
print("الدقة (Precision): 91.23%")
print("الاستدعاء (Recall): 93.45%")
print("F1-Score: 92.33%")
🎯 مميزات المشروع:
- Transfer Learning: استخدام نموذج VGG16 المدرب مسبقاً
- Data Augmentation: زيادة تنوع البيانات لتحسين الأداء
- Fine-tuning: تحسين النموذج للمهمة المحددة
- مقاييس متعددة: تقييم شامل للأداء
🏋️ التمرين الأول: بناء شبكة عصبية للتصنيف
ابن شبكة عصبية لتصنيف أنواع الأزهار باستخدام مجموعة بيانات Iris:
- استخدم 3 طبقات Dense مع 64، 32، 3 عصبون
- طبق Dropout بمعدل 0.3
- استخدم ReLU للطبقات المخفية وSoftmax للطبقة الأخيرة
- احسب الدقة على بيانات الاختبار
🏋️ التمرين الثاني: شبكة تحويلية للصور
ابن شبكة CNN لتصنيف صور الحيوانات (CIFAR-10):
- استخدم 3 طبقات Conv2D مع 32، 64، 128 مرشح
- طبق MaxPooling2D بعد كل طبقة تحويلية
- أضف BatchNormalization لتسريع التدريب
- قارن الأداء مع وبدون Data Augmentation
🏋️ التمرين الثالث: Transfer Learning
استخدم نموذج ResNet50 المدرب مسبقاً لتصنيف صور مخصصة:
- جمد طبقات النموذج الأساسي
- أضف طبقات تصنيف مخصصة
- طبق Fine-tuning على الطبقات الأخيرة
- احسب مقاييس الأداء المختلفة
نصائح للحصول على أفضل النتائج:
• استخدم Learning Rate Scheduling لتحسين التدريب
• طبق Early Stopping لمنع فرط التدريب
• جرب تقنيات التحسين المختلفة (Adam, RMSprop, SGD)
• استخدم Callbacks لمراقبة التدريب وحفظ أفضل النماذج
🔗 الربط بالدرس التالي
في الدرس التاسع، سنتعلم كيفية تطبيق تقنيات التعلم العميق على معالجة اللغات الطبيعية (NLP).
سنستخدم الشبكات العصبية المتكررة (RNN) وLSTM لتحليل النصوص والمشاعر،
وسنبني نظاماً ذكياً لتصنيف التعليقات والمراجعات.