Kodax

أول شبكة عصبية عملية — التعلم العميق

أول شبكة عصبية عملية

ستدرب شبكة تتعرف على الأرقام المكتوبة بخط اليد (بيانات MNIST: 70,000 صورة 28×28 بتدرج رمادي). المثال الكامل بـ Keras؛ شغّله في Google Colab إن لم يكن TensorFlow مثبتاً لديك.

الخطوات الخمس

1. البيانات

load_data() تعيد تدريباً (60,000) واختباراً (10,000). البكسلات أعداد صحيحة من 0 إلى 255.

2. التحضير

- التطبيع: القسمة على 255 لتصبح القيم بين 0 و 1. الشبكات تتدرب أسرع وأثبت بمدخلات صغيرة متقاربة.

- التسطيح: صورة 28×28 ← متجه 784 لطبقة Dense (الشبكات الالتفافية في درس CNN تحافظ على الشكل ثنائي الأبعاد).

3. البناء

784 بكسل ← Dense(128, relu) ← Dropout(0.2) ← Dense(64, relu) ← Dense(10, softmax)

اكتب طبقة المدخل صراحة keras.Input(shape=(784,)) — الأسلوب المفضل في Keras 3 بدل input_shape= داخل أول طبقة.

4. التجميع والتدريب

- optimizer="adam"، loss="sparse_categorical_crossentropy" (الإجابات أرقام 0–9)، metrics=["accuracy"].

- validation_split=0.1: يقتطع 10% من التدريب للتحقق في كل epoch — لا نلمس الاختبار.

5. التقييم

model.evaluate(X_test, y_test) مرة واحدة في النهاية. شبكة كهذه تصل عادة إلى نحو 97–98%.

Dropout

أثناء التدريب فقط، يعطّل Dropout نسبة عشوائية من العصبونات في كل خطوة (20% هنا). الشبكة لا تستطيع الاعتماد على عصبون واحد، فتتعلم تمثيلات أكثر توزعاً ومتانة — مثل فريق يتدرب وبعض لاعبيه غائبون عشوائياً. أثناء التقييم والتنبؤ يتوقف تلقائياً.

نفس الفكرة بـ scikit-learn (تعمل بلا TensorFlow)

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier

X, y = load_digits(return_X_y=True)
X = X / 16.0                                   # تطبيع (بكسلات هذه البيانات من 0 إلى 16)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)

net = MLPClassifier(hidden_layer_sizes=(128, 64), max_iter=300, early_stopping=True, random_state=0)
net.fit(X_tr, y_tr)
print(f"دقة الاختبار: {net.score(X_te, y_te):.2%} بعد {net.n_iter_} دورة")

MLPClassifier مناسب للتجارب الصغيرة، لكنه بلا GPU ولا طبقات متقدمة؛ للمشاريع الحقيقية Keras أو PyTorch.

التنبؤ على صورة جديدة

model.predict يعيد 10 احتمالات لكل صورة، و argmax يعطي الرقم الأرجح. انتبه للأشكال: صورة واحدة يجب أن تكون دفعة من عنصر واحد (1, 784).

تمرين

في المثال الكامل: احذف Dropout وقارن منحنيي التدريب والتحقق، ثم جرّب طبقة مخفية واحدة بـ 512 عصبوناً. أي الشبكات أفضل على التحقق؟ واطبع 5 صور أخطأ فيها النموذج — هل تستطيع أنت قراءتها؟

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt

# ===== 1. تحميل البيانات =====
(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()

print(f"Training: {X_train.shape}")  # (60000, 28, 28)
print(f"Testing: {X_test.shape}")    # (10000, 28, 28)

# عرض بعض الصور
fig, axes = plt.subplots(1, 5, figsize=(10, 2))
for i, ax in enumerate(axes):
    ax.imshow(X_train[i], cmap='gray')
    ax.set_title(f"Label: {y_train[i]}")
    ax.axis('off')
plt.show()

# ===== 2. تحضير البيانات =====
# تسطيح الصور: 28×28 → 784
X_train = X_train.reshape(-1, 784) / 255.0
X_test = X_test.reshape(-1, 784) / 255.0

# ===== 3. بناء الشبكة =====
model = keras.Sequential([
    keras.layers.Dense(128, activation='relu', input_shape=(784,)),
    keras.layers.Dropout(0.2),  # لمنع Overfitting
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# ===== 4. التدريب =====
history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.1
)

# ===== 5. التقييم =====
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"دقة الاختبار: {test_acc:.2%}")

# تجربة على صورة
prediction = model.predict(X_test[:1])
print(f"التنبؤ: {prediction.argmax()}")
print(f"الفعلي: {y_test[0]}")
اختبر فهمك