Kodax

مشروع 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("تم حفظ النموذج!")
اختبر فهمك