Transfer Learning — التعلم العميق
نقل التعلم (Transfer Learning)
تدريب شبكة قوية من الصفر يحتاج ملايين الصور وأياماً من GPU. لكن شبكة دُربت على ImageNet (1.4 مليون صورة، 1000 فئة) تعلمت بالفعل الحواف والأنسجة والأشكال — وهذه مفيدة لأي مهمة صور. نقل التعلم = أخذ هذه المعرفة وتكييفها لمهمتك بصور قليلة.
المرحلتان
1. استخراج الميزات (Feature Extraction)
- حمّل النموذج بلا رأسه (include_top=False): نزيل طبقة الـ 1000 فئة.
- جمّد القاعدة: base.trainable = False.
- أضف رأساً جديداً صغيراً لفئاتك، ودرّبه وحده.
2. الضبط الدقيق (Fine-tuning) — اختياري
- بعد أن يستقر الرأس، أذب تجميد آخر طبقات القاعدة.
- درّب بمعدل تعلم صغير جداً (1e-5): تعديلات طفيفة لا تدمّر ما تعلمه النموذج.
- لماذا الترتيب؟ رأس عشوائي في البداية يرسل تدرجات كبيرة وعشوائية تخرّب الأوزان المدربة إن لم تكن مجمدة.
from tensorflow import keras
from tensorflow.keras import layers
base = keras.applications.MobileNetV2(include_top=False, weights="imagenet", input_shape=(160, 160, 3))
base.trainable = False
inputs = keras.Input(shape=(160, 160, 3))
x = keras.applications.mobilenet_v2.preprocess_input(inputs) # نفس معالجة التدريب الأصلي
x = base(x, training=False) # يبقي BatchNorm في وضع التنبؤ حتى عند الضبط الدقيق
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(5, activation="softmax")(x)
model = keras.Model(inputs, outputs)أخطاء شائعة
- معالجة مسبقة خاطئة: كل نموذج يتوقع مدخلات بطريقة محددة (بعضها [−1، 1] وبعضها بطرح متوسطات). استخدم preprocess_input الخاصة بالنموذج.
- حجم الصورة: النماذج تعمل أفضل قرب حجم تدريبها (160–224 بكسلاً). كبّر داخل النموذج لكل دفعة (طبقة Resizing) لا لكل البيانات مسبقاً — تكبير آلاف الصور دفعة واحدة يستنزف الذاكرة.
- معدل تعلم كبير في الضبط الدقيق يمحو الفائدة.
- نسيان training=False مع طبقات BatchNorm في القاعدة.
أي نموذج؟
| النموذج | المزايا |
|---|---|
| MobileNetV2/V3 | صغير وسريع — للجوال والتجارب |
| EfficientNet | توازن ممتاز بين الدقة والحجم |
| ResNet50 | كلاسيكي ومتين |
| ConvNeXt / Vision Transformers | الأدق حالياً، وأثقل |
نفس المبدأ في النصوص
نماذج اللغة المدربة مسبقاً (BERT وأخواتها) تُضبط على مهمتك (تصنيف مشاعر، أسئلة وأجوبة) بنفس المنطق — درس Transformers.
تمرين
في المثال الكامل اطبع عدد المعاملات القابلة للتدريب قبل الضبط الدقيق وبعده. ثم جرّب إذابة تجميد كل الطبقات بمعدل تعلم 1e-3 — ماذا يحدث لدقة التحقق؟
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.applications import MobileNetV2
# ===== 1. تحميل النموذج المُدرب =====
base_model = MobileNetV2(
weights='imagenet', # أوزان ImageNet
include_top=False, # بدون الطبقة الأخيرة
input_shape=(224, 224, 3)
)
# تجميد الطبقات
base_model.trainable = False
# ===== 2. إضافة طبقات جديدة =====
model = keras.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax') # 10 فئات
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
model.summary()
# ===== 3. التدريب الأول (Feature Extraction) =====
# history = model.fit(train_data, epochs=10)
# ===== 4. Fine-tuning (اختياري) =====
# فتح آخر 20 طبقة
base_model.trainable = True
for layer in base_model.layers[:-20]:
layer.trainable = False
# إعادة Compile بـ learning rate صغير
model.compile(
optimizer=keras.optimizers.Adam(1e-5), # أصغر بكثير!
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# history = model.fit(train_data, epochs=5)
print(f"Total layers: {len(base_model.layers)}")
print(f"Trainable: {sum([l.trainable for l in base_model.layers])}")اختبر فهمك