أقسام الوصول السريع (مربع البحث)

📰 آخر الأخبار

🧠 الدرس الثامن: TensorFlow وKeras

الدرس الثامن: TensorFlow وKeras - الشبكات العصبية العميقة

🧠 الدرس الثامن: TensorFlow وKeras

الشبكات العصبية العميقة - من النظرية إلى التطبيق

📖
الدرس الثامن
⏱️
120-150 دقيقة
🎓
متقدم
💻
مشروع شامل

🎯 أهداف الدرس

  • فهم أساسيات TensorFlow وKeras والفرق بينهما
  • بناء الشبكات العصبية العميقة من الصفر
  • تطبيق الشبكات التحويلية (CNN) لمعالجة الصور
  • تحسين أداء النماذج وتجنب فرط التدريب
  • مشروع عملي: تصنيف الصور الطبية

🔍 ما هو TensorFlow وKeras؟

مقارنة TensorFlow وKeras

🚀 حقائق مذهلة:

  • 85% من مشاريع التعلم العميق تستخدم TensorFlow
  • Google وUber وAirbnb تعتمد على TensorFlow في الإنتاج
  • أكثر من 180,000 مطور يساهمون في تطوير TensorFlow
  • Keras أصبح جزءاً رسمياً من TensorFlow 2.0

TensorFlow هو مكتبة مفتوحة المصدر طورتها Google لبناء وتدريب نماذج التعلم الآلي والتعلم العميق. بينما Keras هو واجهة برمجة تطبيقات عالية المستوى تجعل بناء الشبكات العصبية أسهل وأسرع.

الخاصية TensorFlow Keras
مستوى التعقيد منخفض المستوى عالي المستوى
سهولة الاستخدام معقد للمبتدئين سهل وبديهي
المرونة مرونة كاملة مرونة محدودة
سرعة التطوير بطيء سريع جداً

🏗️ بناء أول شبكة عصبية

تكامل Keras مع TensorFlow

سنبدأ ببناء شبكة عصبية بسيطة لتصنيف الأرقام المكتوبة بخط اليد:

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 لتحليل النصوص والمشاعر، وسنبني نظاماً ذكياً لتصنيف التعليقات والمراجعات.

تعليقات