اذهب إلى المحتوى
  • 0

التنعيم (Regularization) في Keras باستخدام طبقة ال Dropout

Meezo ML

السؤال

Recommended Posts

  • 1

ال dropout أو "التسرب " هو إحدى تقنيات محاربة ال Overfitting (الضبط الزائد). مبدأ هذه التقنية هو تجاهل أو تعطيل بعض الخلايا (العصبونات) بشكل عشوائي في طبقات (أو طبقة) الشبكة العصبية. . تأمل الصورة التالية:
1_iWQzxhVlvadk6VAJjsgXgg.png.2fda9f4e3b81f51d5a02fa42a4acb3c7.png
وبالتالي سنقوم بمنع المودل من التركيز على خاصية "feature" معينة و نجبره على التعلم من كل الخصائص الموجودة لا أن يأخذ خاصية واحدة كقاعدة في التعلم ويعتمد عليها بشكل دائم. وبهذه الطريقة نتجنب حالة الـ overfitting ونتعلم من كل الخصائص الموجودة. أي أن الفكرة خلف هذه التقنية هي أنه في كل تكرار نقوم بتعطيل خلايا (نجعلها لاتشترك في التدريب والتوقع) بينما الخلايا المتبقية تشارك في عملية التدريب والتوقع، أي يستخدم مجموعة جزئية من العصبونات في كل تكرار (التكرار الواحد هو عملية انتشار أمامي (للتوقع) ثم انتشار خلفي(لتحديث قيم الأوزان)). أي أن تأثير هذه التقنية هو أن الشبكة تصبح أقل حساسية للأوزان المحددة للخلايا العصبية. ينتج عن هذا بدوره شبكة قادرة على التعميم "generalization " بشكل أفضل ومن غير المرجح أن تقع في ال OF على بيانات التدريب. ويمكننا أن نقول أيضاً أن الشبكة لن تقوم بحفظ مسار أو سلوك معين في عملية التوقع. انظر للصورة التالية:
1_-teDpAIho_nzNShRswkfrQ.thumb.gif.8b1d5c679c7b5fda37a30a951b443288.gif
 وفي كيراس يمكنك استخدامها بالشكل التالي:

from tensorflow.keras.layers import Dropout
Dropout(rate)

حيث أن ال rate هو معدل الحذف ويأخذ قيمة بين 0 و 1. فمثلاً عند وضع 0.5 أي سيتم تعطيل 50% من العصبونات، وتعتبر هذه القيمة من الـ hyper parameters أيضاً التي يجب ضبطها في نموذجك بشكل دقيق. فاختيار قيم كبيرة لل rate (فوق 0.5) قد يؤدي إلى مشكلة جديدة وهي ال Underfitting. يجب أن تعلم أيضاً أنه يتم استخدام التسرب فقط أثناء تدريب النموذج ولا يتم استخدامه عند التقييم النهائي للنموذج (مرحلة التدريب مثلاً أو الاستخدام العملي) أي بمعنى آخر يستخدم فقط في مرحلة التدريب أما في مرحلة الاختبار أو الاستخدام فإنه تلقائياً لايتم إشراكها في عملية التوقع. الآن سأعطيك مثال عملي عليه أثناء بناء نموذج لتصنيف الأرقام المكتوبة بخط اليد:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D
# تحميل البيانات
import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train.shape # (60000, 28, 28)
#  4-dims تحويل المصفوفة إلى شكل رباعي الأبعاد 
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)
# لنتمكن من الحصول على الفواصل العشرية بعد القسمة 
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# Normalizing
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print('Number of images in x_train', x_train.shape[0])
print('Number of images in x_test', x_test.shape[0])
# بناء النموذج
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation=tf.nn.relu))
model.add(Dropout(0.2)) # هنا أضفنا طبقة
model.add(Dense(10,activation=tf.nn.softmax))
# تجميع النموذج
model.compile(optimizer='rmsprop', 
              loss='sparse_categorical_crossentropy', 
              metrics=['acc'])
model.fit(x_train,y_train, epochs=9)
model.evaluate(x_test, y_test) # 98.5%

حيث نضيفها بعد الطبقة التي نريد تطبيق التسرب عليها، وهنا قمنا بإضاففتها بعد الطبقة dense(128)  أي أن هذه الطبقة سيتم تطبيق التسرب عليها خلال عملية التدريب وبالتالي في كل كل تكرار سيتم تعطيل (أو تجاهل) 20% من الخلايا فيها بشكل عشوائي، أي في كل تكرار ستشترك 102 خلية في التدريب والتوقع وسيتم تجاهل باقي الخلايا. وطبعاً يمكنك إضافتها بعد كل طبقة من طبقات نموذجك (هذا يرجع لك حسب تقديرك للمشكلة وماتتطلبه). لكن لاتستخدمها في بداية النموذج أي بعد التعليمة sequential لأنه في هذه الحالة تكون قد طبقتها على طبقة الدخل وبالتالي سيتم تجاهل قسم من ال features الخاصة بعيناتك وهذا أمر غير محبذ أبداً.

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

يعاني تعلم الألة والتعلم العميق من كثرة ال parameters أو المتغيرات التي يتم ظبطها خلال عملية التعلم، وتؤدي كثرتها الى شيئين رئيسين، أولهما البطئ في عملية التعلم، الثانية هي ال overfitting أو الضبط الزائد وهو أن يتعلم الموديل فقط بناء على البيانات التى ليده ولا يستطيع التعميم.

من أجل حل تلك المشكلة ، نلجأ الي عدة طرق لتقليل عدد المتغيرات التي نقوم بتدريبها، احدى هذه الطرق هو ال droupout.

.ما يسبب ال overfitting، أن الشبكة تعتمد  غالبًا على مجموعات محددة جدًا من الوزن ، نوع من "مؤامرة" الأوزان. كونها محددة للغاية ، فإنها تميل إلى أن تكون هشة: أزل واحدة وتنهار المؤامرة.

هذه هي الفكرة من وراء التسرب. لتفكيك هذه المؤامرات ، نتخلى بشكل عشوائي عن جزء من وحدات إدخال الطبقة في كل خطوة من التدريب ، مما يجعل من الصعب على الشبكة تعلم تلك الأنماط الزائفة في بيانات التدريب. بدلاً من ذلك ، يجب أن تبحث عن أنماط عامة وواسعة ، والتي تميل أنماط وزنها إلى أن تكون أكثر قوة.يمكنك أيضًا التفكير في التسرب على أنه إنشاء نوع من مجموعة الشبكات. لن يتم إجراء التنبؤات من قبل شبكة واحدة كبيرة ، ولكن بدلاً من ذلك من قبل لجنة من الشبكات الأصغر.

في الشكل التفاعلي الأتي، نري أنه يتم أختيا اثنين فقط من الأربع طبقات من أجل اكمال عملية التعلم بينما يتم التخلي عن اثنين أخرين، لذا هنا فإن ال dropout = 0.5:

a86utxY.gif

ملحوظه مهمه: يتم اختيار الطبقات التي تكمل او تسقط من عملية التعلم عشوائيا تماما.

اما عن تطبيقها في keras فهي سهلة للغاية، هناك طبقة تسمي dropout يتم اعطاءها قيمة هي عبارة عن النسبة المراد التخلي عنها كما في المثال الأتي:

keras.Sequential([
    # ...
    layers.Dropout(rate=0.3), # يتم الاستغناء عن 30% من الطبقات في المرحلة التالية
    layers.Dense(16),
    # ...
])

لذلك فإنه اذا  كنت تعاني من ال Overfitting بشكل كبير، يمكنك اختيا تلك القيمه بحيث تكون أكبر من 0.5 اما اذا كان ال overfitting قليل، ضع تلك القيمة صغيره بحيث لا تؤثر عن دقة النموذج، يمكنك اختيار تلك القيمه بحيث تكون أقل من 0.5 

 

تم التعديل في بواسطة Ahmed Sharshar
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...