معاينة مختبر آمنة
Dropout
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
Dropout
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
## أثر الإسقاط (Dropout)
خلونا نشوف بأنفسنا وش يسوي الإسقاط في التدريب. بنستخدم مجموعة البيانات الخاصة بـMNIST وشبكة عصبية التفافية بسيطة عشان نجرّبه:
# Bundled, deterministic handwritten-digits fixture.
from sklearn.datasets import load_digits as _course_load_digits
def _course_digits_load_data():
course_digits = _course_load_digits()
images = np.kron(
course_digits.images.astype(np.float32),
np.ones((3, 3), dtype=np.float32),
)
images = np.pad(images, ((0, 0), (2, 2), (2, 2))) * (255.0 / 16.0)
labels = np.asarray(course_digits.target, dtype=np.int64)
split = int(0.8 * len(images))
return (images[:split], labels[:split]), (images[split:], labels[split:])
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
(x_train, y_train), (x_test, y_test) = _course_digits_load_data()
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)بنعرف دالة `train` عشان تتولى عملية التدريب كلها، ومنها:
* تعريف بنية الشبكة العصبية بمعدل الإسقاط `d` اللي نحدده
* تحديد معاملات التدريب المناسبة، وهي المحسّن ودالة الخسارة
* تنفيذ التدريب وجمع السجل
بعدها بنشغّل الدالة على مجموعة من قيم الإسقاط المختلفة:
def train(d):
print(f"Training with dropout = {d}")
model = keras.Sequential([
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28,28,1)),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Flatten(),
keras.layers.Dropout(d),
keras.layers.Dense(10, activation="softmax")
])
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])
hist = model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=2,batch_size=64)
return hist
res = { d : train(d) for d in [0,0.2,0.5,0.8] }الحين خلونا نرسم منحنيات دقة التحقق لقيم إسقاط مختلفة، ونشوف سرعة التدريب:
for d,h in res.items():
plt.plot(h.history['val_acc'],label=str(d))
plt.legend()من الرسم غالبًا بتلاحظون هالأشياء:
* قيم الإسقاط بين 0.2 و 0.5 تعطي أسرع تدريب وأفضل نتائج إجمالًا
* من دون إسقاط ($d=0$)، غالبًا يكون التدريب أبطأ وأقل استقرارًا
* الإسقاط المرتفع (0.8) يضعّف النتيجة
حذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.