Meezo ML نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 أريد توضيح لعمل دالة التنشيط softmax وكيفية استخدامها في كيراس؟ اقتباس
1 Ali Haidar Ahmad نشر 1 أغسطس 2021 أرسل تقرير نشر 1 أغسطس 2021 هي دالة رياضية نستخدمها كدالة تنشيط، مدخلاتها شعاع من الأعداد، وخرجها شعاع من القيم الاحتمالية، أي تقوم بتحويل متجه الأعداد إلى متجه احتمالي، حيث تتناسب احتمالات كل قيمة مع المقياس النسبي لكل قيمة في المتجه. ونستخدمها لمهام التصنيف المتعدد، حيث نضعها في آخر طبقة. ولها الشكل التالي: أي تأخذ كل قيمة من قيم شعاع الدخل على حدى، ثم تقوم بحساب ال exp لهذا العدد ثم تقسم الناتج على المجموع الكلي لل exp لكل العينات (وبالتالي الخرج سيكون عبارة عن توزيع احتمالي). ولفهم هذا الكلام أكثر لنأخذ المثال التالي، لدينا 3 أصناف من الكرات (x,y,z) بما أنه لدينا 3 أصناف وبالتالي خرج الشبكة يجب أن يكون 3 قيم (أي يجب أن يكون لديك 3 خلايا في الخرج) بحيث كل قيمة تعبر عن احتمالية أن العينة هي إحدى الأصناف، حسناً لنرمز ل x ب 0 و y ب 1 و z ب 2 وبالتالي يمكن تمثيلها ك One-hot بالشكل التالي : x0=[1,0,0] y0=[0,1,0] z0=[0,0,1] ونحن لدينا 3 عصبونات في آخر طبقة، وبالتالي سيمثل العصبون الأول احتمالية كون العينة (الكرة) تمثل الصنف x، والعصبون الثاني احتمالية كون العينة (الكرة) تمثل الصنف y، والعصبون الأخير احتمالية كون العينة تنتمي للصنف z. فمثلاً من أجل عينة ما، عند الوصول لآخر طبقة سيتم إدخال ناتج آخر طبقة ( هنا شعاع من 3 قيم) إلى هذا التابع وبالتالي يصبح الخرج احتمالياً كما يلي: طبعاً القيم الاحتمالية التي وضعتها بشكل تقديري، لكن حتماً سيكون المجموع1، الآن سأكتب لك إياها بكود بسيط: # transform values into probabilities from math import exp # calculate each probability summation=(exp(7.0) + exp(2.0) + exp(0.1)) p1 = exp(7.0) / summation p2 = exp(2.0) / summation p3 = exp(0.1) / summation print(p1, p2, p3) # 0.9923138027987766 0.006686157809719105 0.0010000393915043245 # sum of probabilities print(p1 + p2 + p3) # 1.0 انظر كيف سأقوم بتحقيق هذا التابع، وسأطبقه على نفس السؤال: from numpy import exp def softmax(vector): e = exp(vector) return e / e.sum() # define data data = [7.0, 2.0, 0.1] # التحويل result = softmax(data) print(result) # probabilities # [0.9923138 0.00668616 0.00100004] في كيراس وتنسرفلو تتواجد في الموديول التالي (لاحظ أنه موجود ضمن موديول الطبقات): tf.keras.layers.Softmax() ويمكنك تمريرها لنموذجك كدالة تنشيط في آخر طبقة عندما تكون المهمة مهمة تصنيف، كما في المثال التالي، حيث أنه لدينا مهمة تصنيف متعدد ل 46 صنف: from keras.datasets import reuters (train_data, train_labels), (test_data, test_labels) = reuters.load_data( num_words=10000) # ترميز البيانات import numpy as np def vectorize_sequences(sequences, dimension=10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1. return results x_train = vectorize_sequences(train_data) x_test = vectorize_sequences(test_data) from keras.utils.np_utils import to_categorical one_hot_train_labels = to_categorical(train_labels) one_hot_test_labels = to_categorical(test_labels) # بناء النموذج from keras import models from keras import layers model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(10000,))) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(46, activation='softmax')) # هنا الطبقةالأخيرة model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # التدريب x_val = x_train[:1000] partial_x_train = x_train[1000:] y_val = one_hot_train_labels[:1000] partial_y_train = one_hot_train_labels[1000:] history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val)) وللتنويه يمكنك أيضاً استخدامها في الطبقات الخفية لكنها لن تعطيك نتائج مقبولة، مقارنة بالدوال الأخرى (استخدمها فقط كدالة تنشيط في الطبقة الأخيرة). 1 اقتباس
1 Ahmed Sharshar نشر 3 أغسطس 2021 أرسل تقرير نشر 3 أغسطس 2021 في البداية دعنا نتذكر دالة التنشيط tanh أو sigmoid والتي تقوم باخراج أحتمال الخرج فقط اذا كان ثنائي (0 او 1) تقوم softmax بتوسيع تلك الفكرة لانها تستطيع اخراج أكثر من صنف multi class وذلك عندما يكون الخرج الخاص بنا متعدد (قطة أو كلب أو أسد ...الخ) أي أن Softmax تقوم بتعيين احتمالات عشرية لكل فئة في تصنيف ال Multi class . يجب ان يكون مجموع تلك الاحتمالات = 1.0. يساعد هذا في التدريب حيث يجعله يتعلم بسرعة أكبر مما لو كان الأمر خلاف ذلك. الشكل التالي يوضح هذة الفكرة: حيث تمثل تلك المعادلة ال softmax بحيث يقوم بادخال كل قيمه ووضعها في دالة اسية e ثم حساب قيمتها مقسومه على مجموع كل القيم مرفوع للدالة الاسية e. وتتميز تلك الدوال بقدرتها على تصنيف متعدد من الفئات عكس معظم الدوال التنشيطية الاخرى، لكن على صعيد أخر فانها أبطا نسبية من منافسيها نظرا لاحتياجها لحساب عمليات اسيه تاخذ وقتا. اما عن استخدامها في keras فهي سهلة كالتالي: tf.keras.layers.Softmax(axis=-1, **kwargs) كمثال: >>> inp = np.asarray([1., 2., 1.]) >>> layer = tf.keras.layers.Softmax() >>> layer(inp).numpy() array([0.21194157, 0.5761169 , 0.21194157], dtype=float32) >>> mask = np.asarray([True, False, True], dtype=bool) >>> layer(inp, mask).numpy() array([0.5, 0. , 0.5], dtype=float32) وفي الموديل، عادة ما تستخدم في أخر طبقة فقط من التعلم كالتالي: model.add(layers.Dense(46, activation='softmax')) # الطبقة الاخيرة من التعلم model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) اقتباس
السؤال
Meezo ML
أريد توضيح لعمل دالة التنشيط softmax وكيفية استخدامها في كيراس؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.