Meezo ML نشر 29 يوليو 2021 أرسل تقرير نشر 29 يوليو 2021 كنت أقرأ نموذج وإحدى الطبقات كانت: model.add(Dropout(0.5)) ماهي وظيفة هذه الطبقة؟ وكيف نستخدمها في كيراس مع نماذجنا؟ اقتباس
1 Ali Haidar Ahmad نشر 29 يوليو 2021 أرسل تقرير نشر 29 يوليو 2021 (معدل) ال dropout أو "التسرب " هو إحدى تقنيات محاربة ال Overfitting (الضبط الزائد). مبدأ هذه التقنية هو تجاهل أو تعطيل بعض الخلايا (العصبونات) بشكل عشوائي في طبقات (أو طبقة) الشبكة العصبية. . تأمل الصورة التالية: وبالتالي سنقوم بمنع المودل من التركيز على خاصية "feature" معينة و نجبره على التعلم من كل الخصائص الموجودة لا أن يأخذ خاصية واحدة كقاعدة في التعلم ويعتمد عليها بشكل دائم. وبهذه الطريقة نتجنب حالة الـ overfitting ونتعلم من كل الخصائص الموجودة. أي أن الفكرة خلف هذه التقنية هي أنه في كل تكرار نقوم بتعطيل خلايا (نجعلها لاتشترك في التدريب والتوقع) بينما الخلايا المتبقية تشارك في عملية التدريب والتوقع، أي يستخدم مجموعة جزئية من العصبونات في كل تكرار (التكرار الواحد هو عملية انتشار أمامي (للتوقع) ثم انتشار خلفي(لتحديث قيم الأوزان)). أي أن تأثير هذه التقنية هو أن الشبكة تصبح أقل حساسية للأوزان المحددة للخلايا العصبية. ينتج عن هذا بدوره شبكة قادرة على التعميم "generalization " بشكل أفضل ومن غير المرجح أن تقع في ال OF على بيانات التدريب. ويمكننا أن نقول أيضاً أن الشبكة لن تقوم بحفظ مسار أو سلوك معين في عملية التوقع. انظر للصورة التالية: وفي كيراس يمكنك استخدامها بالشكل التالي: 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 الخاصة بعيناتك وهذا أمر غير محبذ أبداً. تم التعديل في 29 يوليو 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
1 Ahmed Sharshar نشر 29 يوليو 2021 أرسل تقرير نشر 29 يوليو 2021 (معدل) يعاني تعلم الألة والتعلم العميق من كثرة ال parameters أو المتغيرات التي يتم ظبطها خلال عملية التعلم، وتؤدي كثرتها الى شيئين رئيسين، أولهما البطئ في عملية التعلم، الثانية هي ال overfitting أو الضبط الزائد وهو أن يتعلم الموديل فقط بناء على البيانات التى ليده ولا يستطيع التعميم. من أجل حل تلك المشكلة ، نلجأ الي عدة طرق لتقليل عدد المتغيرات التي نقوم بتدريبها، احدى هذه الطرق هو ال droupout. .ما يسبب ال overfitting، أن الشبكة تعتمد غالبًا على مجموعات محددة جدًا من الوزن ، نوع من "مؤامرة" الأوزان. كونها محددة للغاية ، فإنها تميل إلى أن تكون هشة: أزل واحدة وتنهار المؤامرة. هذه هي الفكرة من وراء التسرب. لتفكيك هذه المؤامرات ، نتخلى بشكل عشوائي عن جزء من وحدات إدخال الطبقة في كل خطوة من التدريب ، مما يجعل من الصعب على الشبكة تعلم تلك الأنماط الزائفة في بيانات التدريب. بدلاً من ذلك ، يجب أن تبحث عن أنماط عامة وواسعة ، والتي تميل أنماط وزنها إلى أن تكون أكثر قوة.يمكنك أيضًا التفكير في التسرب على أنه إنشاء نوع من مجموعة الشبكات. لن يتم إجراء التنبؤات من قبل شبكة واحدة كبيرة ، ولكن بدلاً من ذلك من قبل لجنة من الشبكات الأصغر. في الشكل التفاعلي الأتي، نري أنه يتم أختيا اثنين فقط من الأربع طبقات من أجل اكمال عملية التعلم بينما يتم التخلي عن اثنين أخرين، لذا هنا فإن ال dropout = 0.5: ملحوظه مهمه: يتم اختيار الطبقات التي تكمل او تسقط من عملية التعلم عشوائيا تماما. اما عن تطبيقها في keras فهي سهلة للغاية، هناك طبقة تسمي dropout يتم اعطاءها قيمة هي عبارة عن النسبة المراد التخلي عنها كما في المثال الأتي: keras.Sequential([ # ... layers.Dropout(rate=0.3), # يتم الاستغناء عن 30% من الطبقات في المرحلة التالية layers.Dense(16), # ... ]) لذلك فإنه اذا كنت تعاني من ال Overfitting بشكل كبير، يمكنك اختيا تلك القيمه بحيث تكون أكبر من 0.5 اما اذا كان ال overfitting قليل، ضع تلك القيمة صغيره بحيث لا تؤثر عن دقة النموذج، يمكنك اختيار تلك القيمه بحيث تكون أقل من 0.5 تم التعديل في 29 يوليو 2021 بواسطة Ahmed Sharshar اقتباس
السؤال
Meezo ML
كنت أقرأ نموذج وإحدى الطبقات كانت:
ماهي وظيفة هذه الطبقة؟ وكيف نستخدمها في كيراس مع نماذجنا؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.