Meezo ML نشر 31 يوليو 2021 أرسل تقرير نشر 31 يوليو 2021 توضيح دالة التنشيط tanh في كيراس وتنسرفلو؟ اقتباس
1 Ali Haidar Ahmad نشر 31 يوليو 2021 أرسل تقرير نشر 31 يوليو 2021 (معدل) دالة غير خطية، تشبه كثيراً التابع السيني Sigmoid ولكن الفرق بينهما في مجال قيم الخرج حيث يكون في ال tanh من 1- إلى 1، أي على عكس التابع السيني حيث يكون الخرج من 0 إلى 1. ولها الشكل التالي (الاورنج):من الشكل نلاحظ أنها تأخذ أي قيمة حقيقية كقيم مدخلات. والخرج يكون في النطاق من 1 إلى -1. كلما كانت المدخلات أكبر (أكثر إيجابية) ، كلما كانت قيمة المخرجات أقرب إلى 1.0 ، بينما كلما كانت المدخلات أصغر (أكثر سلبية) ، كلما كان الناتج أقرب إلى -1.0. ومن الرسم البياني نلاحظ أيضاً أنه يمكن استخدامها في تدريب النماذج (مستمر و قابل للإشتقاق في كل مكان)، وكما نلاحظ من الرسم (المنحني الأزرق) فإن المشتق تكون قيمه فعالة للتدريب عندما تكون قيم z قريبة من الصفر (حولها) ولكن من أجل قيم كبيرة جداً أو صغيرة جداً فلن تكون فعالة في التدريب لأن المماس يكون شبه مستقيم وبالتالي قيمة المشتقة تكون صغيرة جداً، مما يؤدي الى بطء شديد في عملية التدريب وبالتالي مكلف من الناحية الحسابية. إن الميزة الأهم في هذا التابع مقارنة بال sigmoid هو أن قيم المشتقات أكبر وبالتالي تدرجاته (Gredint) تكون أكثر قوة نحو القيم الصغرى الشاملة GM أي بمعنى آخر أسرع في التقارب Converge وهذا مايجعله أكثر كفاءة مقارنة بالتابع السيني. أما عيبها فكما ذكرنا هو نفس المشكلة التي تعاني منها sigmoid وهي مشكلة تلاشي التدرجات "vanishing gradient" (المشتقات يصغر حجمها إلى أن تنعدم تقريباً عندما تزداد قيمة Z وهذا واضح من المنحني الأزرق). عند استخدام tanh للطبقات المخفية ، أنصح باستخدام تهيئة الوزن "Xavier Normal" أو "Xavier Uniform" (يُشار إليها أيضاً بتهيئة Glorot) إضافة إلى تقييس "scaling" بيانات الدخل إلى النطاق -1 إلى 1 قبل التدريب. وفي كيراس له الشكل التالي: tf.keras.activations.tanh(x) ويمكنك استخدامه في الطبقات الخفية لنموذجك (لاتستخدمه مع طبقة الخرج فكيراس لاتعالج حالته، رغم أنه يمكن استخدامه)، انظر للمثال التالي: from keras.datasets import imdb from keras import preprocessing max_features = 10000 maxlen = 20 (x_train, y_train), (x_test, y_test) = imdb.load_data( num_words=max_features) x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen) # هنا حددنا طول الكلمات ب 20 x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen) # بناء نموذجك from keras.models import Sequential from keras.layers import Flatten, Dense model = Sequential() model.add(Embedding(10000, 8, input_length=maxlen)) model.add(Flatten()) model.add(Dense(64, activation='tanh'))# بهذه الطريقة """ أو from tensorflow.keras import activations model.add(Dense(64, activation=activations.tanh)) أو بالشكل التالي model.add(Dense(64)) model.add(Activation(activations.tanh)) """ model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) model.summary() # تدريبه history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2) تم التعديل في 31 يوليو 2021 بواسطة Ali Haidar Ahmad اقتباس
1 Ahmed Sharshar نشر 31 يوليو 2021 أرسل تقرير نشر 31 يوليو 2021 تعتبر دالة tanh دالة غير خطية، وهي تتشابه في هذا مع دالة ال sigmoid ، غير أن دالة ال sigmoid تتراوح قيمة الخرج من 0 ل 1 بينما دالة tanh تتراوح قيمة الخرج من -1 ل 1 كما هو موضح في الصورة التالية: هنا ، يمكنك الملاحظة من الرسم البياني ، أن tanh تستطيع ربط المدخلات بالمخرجات جيدًا. يتم تطبيق ذلك بحيث أن المدخلات الإيجابية بشدة (الصحيحة) يتم تعيينها بالقرب من 1 ، بينما يتم تعيين المدخلات السلبية بشدة (الخاطئة) بالقرب من -1. وتعتبر الصيغة الرياضية للدالة tanh كالتالي: f(x) = tanh(x) = (e^(2x) - 1) / (e^(2x) + 1) يمكنك استخدام بايثون لرسم الدالة نفسها بالكود التالي: import numpy as np import matplotlib.pyplot as plt def tanh(x): return np.tanh(x) def generate_sample_data(start, end, step): return np.linspace(start, end, step) x = generate_sample_data(-5, 5, 10) y = tanh(x) # Now plot plt.xlabel("x") plt.ylabel("tanh(x)") plt.plot(x, y) plt.show() ومن أهم ميزاتها انها سريعة في الاستخدام كما أن مشتقتها تشمل المجال كاملا لذلك فأنه لا يمكن أن يحدث أي أخطاء أثناء التدريب. على الرغم أن tanh تحتوي على الكثير من الخصائص الجيدة لبناء الموديل ، يجب على المرء دائمًا توخي الحذر عند استخدامه. لا تزال هذه الدالة دالة تنشيط غير خطية ، مما يعني أنها يمكن أن تكون عرضة لمشكلة عدم الاستقرار في التدريب. مشكلة عدم الاستقرار في التدريب هي الحالة التي تصبح فيها المشتقات تساوى 0 حتى مع حدوث تغيير كبير في المدخلات. أما عن استخدامها في keras بالطريقة الأتية: >>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32) >>> b = tf.keras.activations.tanh(a) >>> b.numpy() array([-0.9950547, -0.7615942, 0., 0.7615942, 0.9950547], dtype=float32) وفي بناء الموديل يمكن أستخدامها كالتالي: model.add(Dense(12, input_shape=(8,), activation='tanh')) model.add(Dense(8, activation='tanh')) اقتباس
السؤال
Meezo ML
توضيح دالة التنشيط tanh في كيراس وتنسرفلو؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.