مشروع Deep Learning متكامل — التعلم العميق
مشروع: مصنّف صور بنقل التعلم
المشروع يجمع الدورة: بيانات CIFAR-10 (60,000 صورة ملونة 32×32 في 10 فئات: طائرة، سيارة، طائر، قطة...)، ونموذج EfficientNetB0 مدرب على ImageNet. يحتاج TensorFlow و GPU لوقت معقول — Google Colab مناسب.
خط سير المشروع
1. البيانات: تحميل وتقسيم (التحقق من التدريب، والاختبار معزول).
2. الزيادة: قلب وتدوير وتكبير داخل النموذج.
3. التكبير داخل النموذج: طبقة Resizing(224, 224) تكبّر كل دفعة عند الحاجة.
4. القاعدة المجمدة + رأس جديد (GlobalAveragePooling ← Dropout ← Dense).
5. Callbacks: EarlyStopping و ModelCheckpoint و ReduceLROnPlateau.
6. المرحلة الأولى: تدريب الرأس فقط.
7. الضبط الدقيق: إذابة آخر 30 طبقة بمعدل تعلم 1e-5.
8. التقييم النهائي وحفظ النموذج بصيغة .keras.
الذاكرة: درس من المثال الأصلي
النسخة السابقة من المثال كانت تكبّر كل الصور إلى 224×224 قبل التدريب: 50,000 × 224 × 224 × 3 × 4 بايت ≈ 30 جيجابايت — يتوقف البرنامج على أي جهاز عادي. القاعدة: حوّل البيانات دفعة دفعة داخل النموذج أو عبر tf.data، لا كلها في الذاكرة.
أسئلة تقييم ذاتي
- لماذا نجمّد القاعدة في المرحلة الأولى؟
- لماذا base_model(x, training=False)؟
- لماذا معدل تعلم الضبط الدقيق أصغر بمئة مرة؟
- ماذا تعني فجوة كبيرة بين دقة التدريب والتحقق هنا، وما الذي تجربه أولاً؟
تحليل النتائج
- مصفوفة الالتباس: أي الفئات تختلط؟ (القطط والكلاب عادة.)
- اعرض صوراً خاطئة مع احتمالاتها: هل الخطأ معقول؟
- قارن النتيجة بشبكة CNN صغيرة من الصفر — كم أضاف نقل التعلم؟
تحسينات مقترحة
1. tf.data مع prefetch لتسريع تغذية البيانات.
2. Mixed precision (keras.mixed_precision.set_global_policy("mixed_float16")) لتسريع التدريب على GPU حديثة.
3. جرّب ConvNeXtTiny أو EfficientNetV2.
4. انشر النموذج: صفحة ويب صغيرة أو تطبيق جوال (TensorFlow Lite).
بإكمال هذه الدورة تفهم كيف تعمل الشبكات العصبية من الداخل وكيف تبني بها حلولاً حقيقية. الخطوة التالية الطبيعية: النماذج اللغوية الكبيرة وتطبيقاتها.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.applications import EfficientNetB0
# ===== 1. تحميل البيانات =====
(X_train, y_train), (X_test, y_test) = keras.datasets.cifar10.load_data()
# لا نكبّر كل الصور مسبقاً: 50,000 صورة 224×224×3 بدقة float32 ≈ 30GB ذاكرة!
# التكبير يتم داخل النموذج لكل دفعة فقط (طبقة Resizing أدناه).
# ===== 2. Data Augmentation =====
data_augmentation = keras.Sequential([
layers.RandomFlip("horizontal"),
layers.RandomRotation(0.1),
layers.RandomZoom(0.1),
])
# ===== 3. Transfer Learning =====
base_model = EfficientNetB0(
weights='imagenet',
include_top=False,
input_shape=(224, 224, 3)
)
base_model.trainable = False
# ===== 4. بناء النموذج =====
inputs = keras.Input(shape=(32, 32, 3))
x = layers.Resizing(224, 224)(inputs) # تكبير دفعة بدفعة عند الحاجة
x = data_augmentation(x)
x = keras.applications.efficientnet.preprocess_input(x)
x = base_model(x, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.BatchNormalization()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
x = layers.BatchNormalization()(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs, outputs)
# ===== 5. Callbacks =====
callbacks = [
keras.callbacks.EarlyStopping(patience=5, restore_best_weights=True),
keras.callbacks.ModelCheckpoint('best_model.keras', save_best_only=True),
keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=3)
]
# ===== 6. التدريب الأول =====
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
print("=== Feature Extraction ===")
history = model.fit(
X_train, y_train,
epochs=10,
validation_split=0.1,
callbacks=callbacks,
batch_size=32
)
# ===== 7. Fine-tuning =====
print("\n=== Fine-tuning ===")
base_model.trainable = True
for layer in base_model.layers[:-30]:
layer.trainable = False
model.compile(
optimizer=keras.optimizers.Adam(1e-5),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
history_fine = model.fit(
X_train, y_train,
epochs=10,
validation_split=0.1,
callbacks=callbacks,
batch_size=32
)
# ===== 8. التقييم النهائي =====
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"\n=== النتيجة النهائية ===")
print(f"Test Accuracy: {test_acc:.2%}")
# حفظ النموذج
model.save('cifar10_classifier.keras')
print("تم حفظ النموذج!")اختبر فهمك