Meezo ML نشر 23 يوليو 2021 أرسل تقرير نشر 23 يوليو 2021 توضيح دالة التنشيط relu واستخدامها في كيراس وتنسرفلو؟ اقتباس
1 ريم المهدي نشر 23 يوليو 2021 أرسل تقرير نشر 23 يوليو 2021 RELU هي إختصار ل Re(ctified) L(inear) (U)nit وهي من أشهر دوال التنشيط المستخدمة، ترجع قيمة 0 في حال كانت القيمة المدخلة أقل من أو تساوي 0 و ترجع نفس قيمة x في حال كانت القيمة أكبر من 0: وبالتالي يمكن كتبتها كالتالي: f(x) = max(0,x) هذه الدالة تتكون من دالتين خطيتين و مع بعضهما تكونان الدالة غير الخطية، وفي حالة القيم المدخلة كانت موجبة لا يوجد حدود للقيم التي تخرجها الدالة فهي تعتمد على مقدار القيمة الموجبة المدخلة. و تعتبر من أسرع الدوال بالمقارنة مع دوال أخرى مثل Sigmoid, Tanh. والان لنتعرف على كيفية التعامل مع relu في tensorflow ، تستخدم relu كعملية في الشبكات العصبية و تستقبل القيم في شكل tensor: y = tf.nn.relu( x ) و تستخدم كأحد طبقات الشبكات العصبية، كما يمكن أيضاً التعامل مع relu بصورة مباشرة كدالة تنشيط و ذلك عن طريق: tf.keras.activations.relu وبالتالي فإن الدالة موجودة في activation module و يمكن إضافتها لأي نموذج بإضافة طبقة كالتالي: model.add( keras.layers.Dense( 25 , activation=tf.keras.activations.relu ) ) لاحظ أن الفرق الأساسي في الطريقتين هو أن الأولى تركز على إنشاء الشبكات العصبية من البداية و في الثانية نتعامل مع الطبقات في نموذج محدد. اقتباس
1 Ali Haidar Ahmad نشر 23 يوليو 2021 أرسل تقرير نشر 23 يوليو 2021 (معدل) ReLU (Rectified Linear Unit) هو تابع تنشيط خطي على القسم الموجب وخطي على القسم السالب، لكن تركيبهما هو مابعطيه الصفة اللاخطية، له الشكل الرياضي البسيط التالي: max(0,x) بحيث من أجل دخل x>0 سيكون خرجه هو x نفسها (أي لاتغيير أي كأننا لم نستخدم تابع تنشيط أي None ) ومن أجل دخل أصغر من الصفر يكون الخرج 0، هذا يعني أنه يسلك سلوك None من أجل الجزء الموجب وكما نعلم فإن أسعار المنازل هي دوماً موجبة وبالتالي استخدام relu سيكون مكافئاً ل None ولكن أفضل لأنه في حالة توقع النموذج قيمة سالبة للنموذج سوف يقصرها على 0 أي إذا توقع -5 سوف يجعلها 0 بسبب تابع ال relu ولهذا السبب كان استخدامه يعطي نتيجة أفضل، لكن هذا لايعني أن استخدامه صحيح وخصوصاً إذا كانت القيم السالبة ضمن مجال التوقع، وأيضاً استخدامه قد يضلل نموذجك قليلاً في الوصول للقيم الصغرى الشاملة لذا أنا أفضل عدم استخدامه. الشكل البياني للتابع: كما نلاحظ فإن قيم المشتق تساوي الصفر أيضاً من أجل القيم السالبة (ليس أمراً جيداً لأنه يسبب بطء لكنه مهمل هنا)، بينما من أجل القيم الموجبة يكون حالة مثالية للتدريب حيث أن قيمة المشتق تكون كبيرة وثابتة (القيمة تساوي 1 كما نلاحظ في الرسم). وهذا يجعل عملية التدريب أسرع (التقارب من القيم الصغرى الشاملة). أحد سلبيات هذا التابع أنه يقوم بتحويل جميع القيم السالبة إلى صفر، اي أنه في حالة القيم السالبة سينظر إليها التابع بشكل واحد وهو الصفر, مما قد يتسبب بخسارة معلومات هامة أثناء تدريب الشبكة. في كيراس أو تنسرفلو له الشكل التالي: tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0) بحيث أن x هي tensor أو متغير ما. أما alpha فيتحكم في ميل القيم الأقل من العتبة. أما max_value فهي التي تحدد عتبة التشبع (أكبر قيمة سترجعها الدالة). أما الوسيط الأخير فهو العتبة أي إعطاء القيمة الحدية لوظيفة التنشيط التي تحتها القيم التي سيتم تثبيطها أو ضبطها على الصفر. وافتراضياً تكون 0. ولاستخدامه في تدريب نموذجك يمكنك استخدامه مع جميع الطبقات في الشبكة عدا طبقة الخرج. وشخصياً أنصحك باستخدامه في جميع طبقات شبكتك (عدا طبقة الخرج طبعاً) لأنه سيجعل نموذجك يتقارب من القيم الصغرى بشكل أسرع كما ذكرت. إليك المثال التالي الذي سأقوم فيه باستخدام هذا التابع في تدريب نموذجي، أول مثال لمهمة توقع: from keras.datasets import boston_housing (train_data, train_targets), (test_data, test_targets) =boston_housing.load_data() mean = train_data.mean(axis=0) train_data -= mean std = train_data.std(axis=0) train_data /= std test_data -= mean test_data /= std from keras import models from keras import layers model = models.Sequential() # يمكنك تمريره إلى طبقتك بالشكل التالي # أو tf.keras.activations.relu() model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) history = model.fit(train_data, train_targets,epochs=7, batch_size=1, verbose=1) ------------------------------------------------- Epoch 1/7 404/404 [==============================] - 1s 967us/step - loss: 338.1444 - mae: 15.1877 Epoch 2/7 404/404 [==============================] - 0s 1ms/step - loss: 21.6941 - mae: 3.1332 Epoch 3/7 404/404 [==============================] - 0s 1ms/step - loss: 17.6999 - mae: 2.8479 Epoch 4/7 404/404 [==============================] - 0s 947us/step - loss: 13.1258 - mae: 2.4018 Epoch 5/7 404/404 [==============================] - 0s 970us/step - loss: 15.7603 - mae: 2.6360 Epoch 6/7 404/404 [==============================] - 0s 1ms/step - loss: 12.1877 - mae: 2.3640 Epoch 7/7 404/404 [==============================] - 0s 965us/step - loss: 9.7259 - mae: 2.2152 و لاستخدامه مع مهام التصنيف، يكون أيضاً بنفس الطريقة. تم التعديل في 23 يوليو 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Ahmed Sharshar نشر 25 يوليو 2021 أرسل تقرير نشر 25 يوليو 2021 (معدل) تسمي دالة التنشيط Rectified Linear Unit (ReLU) وتعني الدالة الخطية المعدلة، وذلك لانها ليست خطية بالكامل ، بل انها تكون خطية من 0 وحتي لانهاية اما قبل ال 0 (أي في الجزء السالب) فانها تساوي 0 كما هو موضح بالشكل البياني : ويمكن كتابتها كدالة بالشكل التالي: f(x) = max(0,x) وتستخدم دوال التنشيط عموما في تصحيح الاخطاء الناتجة عن التوقع أثناء التعلم، ويمكن عمل ذلك عن طريق اخذ التفاضل لتلك الدالة وقارنتها بالناتج الاصلي، فعند أخذ التفاضل لدالة ال ReLU تكون كالتالي: f`(x) = { 1 if x < 0 0 if x > 0} وهذا يعني انه اذا كانت القيم موجبة (أي صحيحة) فانه لا يتم احداث أي تغيير على القيمة، أما اذا كانت سالبة (أي خطأ) فانه يتم تعديلها بأقصي قيمة ممكنة وبالتالي فانه يقوم بتعديل القيم أثناء التدريب حتي تقترب من كونها صحيحة.أما اذا كانت القيمة تساوي صفرا تماما (وهو شئ نادر أن يحدث) فأن الدالة تصبح غير معرفة وهذا قد يخلق مشكلة، وتعتبر هذة احدى مشكلات دالة ال ReLU. وتعتبر ReLU احدى اكثر الدوال المستخدمة كدوال تنشيط، خصوصا في عملية ال backpropagation، وذلك لعدة اسباب منها: 1) سهلة في تطبيقها حيث انها تختار فقط القيمة الاكبر بين القيم المدخلة والصفر. 2) بسبب كونها دالة خطية فانها تصبح ملائمة اكثر في عملية التحسين optimization 3) سريعة في استخدامها وتأخذ وقتها موارد أقل من غيرها. أما عن كيفية استخدامها في keras و tensorflow فلا حاجه لاعادة تعريف الدالة ومشتقتها من جديد ، حيث انه معرفة سابقا داخل keras كالتالي: tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0) # X هي البيانات المدخلة في هيئة متغير # alpha ميل القيم الاقل من الصفر وهي افتراضيا none # max_value هي اقصي قيمة تقوم الدالة بارجاعها # threshold هي الحد الفاصل بين القيم الصحيحة والخطأ وهي افتراضيا 0 كما وضحنا سابقا ويمكن استخدامها بسهولة وتضاف الاسطر السابقة بين أي طبقتين من طبقات التعلم (layers) كالتالي: from tensorflow.keras import layers from tensorflow.keras import activations model.add(layers.Dense(64)) model.add(layers.Activation(activations.relu)) تم التعديل في 25 يوليو 2021 بواسطة Ahmed Sharshar اقتباس
السؤال
Meezo ML
توضيح دالة التنشيط relu واستخدامها في كيراس وتنسرفلو؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.