يمكن اعتبار الطبقات في نموذج التعلم العميق (deep learning) بمثابة بنية النموذج. ويمكن أن تكون هناك أنواع مختلفة من الطبقات التي يمكن استخدامها في النماذج. كل هذه الطبقات المختلفة لها أهميتها الخاصة بناءً على ميزاتها. كما نستخدم طبقات LSTM في الغالب في تحليل السلاسل الزمنية (time series analysis) أو في مشاكل البرمجة اللغوية العصبية (NLP)، الطبقات التلافيفية (convolutional layers) في معالجة الصور، وإلخ. يُشار إلى الطبقة الكثيفة (dense layer) أيضا باسم الطبقة المتصلة بالكامل (fully connected layer)، وإنها طبقة تُستخدم في المراحل الأخيرة من الشبكة العصبية. تساعد هذه الطبقة في تغيير أبعاد المخرجات من الطبقة السابقة بحيث يمكن للنموذج ببساطة تحديد العلاقة بين قيم البيانات التي يعمل فيها النموذج. سنناقش في هذه المقالة الطبقة الكثيفة بالتفصيل مع أهميتها وعملها. فالنقاط الرئيسية التي ستتم مناقشتها في هذه المقالة مذكورة أدناه.
جدول المحتويات
- ما هي الطبقة الكثيفة (dense layer)؟
- الطبقة الكثيفة (dense layer) من Keras
- المعايير الفائقة للطبقة الكثيفة فی کیراس
- العمليات الأساسية في الطبقة الكثيفة
- كيف يتم تنفيذ الطبقة الكثيفة؟
ما هي الطبقة الكثيفة (dense layer)؟
الطبقة الكثيفة (dense layer) في أي شبكة عصبية (neural network)، هي طبقة مرتبطة ارتباطًا وثيقًا بطبقتها السابقة مما يعني أن الخلايا العصبية (neurons) للطبقة متصلة بكل خلية عصبية في الطبقة السابقة. هذه الطبقة هي الطبقة الأكثر استخدامًا في الشبكات العصبية الاصطناعية.
تستقبل الخلايا العصبية للطبقة الكثيفة في النموذج ناتج من كل خلية عصبية في الطبقة السابقة، حيث تقوم الخلايا العصبية للطبقة الكثيفة بضرب متجه المصفوفة (matrix vector). إن ضرب متجه المصفوفة (matrix vector multiplication) هو إجراء يكون فيه متجه الصف للمخرج من الطبقات السابقة مساويًا لمتجه العمود للطبقة الكثيفة. القاعدة العامة لضرب متجه المصفوفة هي أن متجه الصف (row vector) يجب أن يحتوي على العديد من الأعمدة مثل متجه العمود (column vector).
الدالة العامة لمنتج متجه المصفوفة (matrix vector product) هي:

حيث A هي مصفوفة (M × N) و x هي مصفوفة (1xN). القيم الموجودة في المصفوفة هي المعلمات المدربة (trained parameters) للطبقات السابقة ويمكن أيضًا تحديثها عن طريق backpropagation. Backpropagation هي الخوارزمية الأكثر استخدامًا لتدريب الشبكات العصبية الأمامية (feedforward neural networks). وبشكل عام، يحسب backpropagation في الشبكة العصبية التدرج اللوني (gradient) لدالة الخسارة (loss function) فيما يتعلق بأوزان الشبكة للإدخال أو الإخراج الفردي. يمكننا من الحدس أعلاه القول بأن الناتج القادم من الطبقة الكثيفة سيكون متجه N الأبعاد. ويمكننا أن نرى أنه يقلل من أبعاد المتجهات. لذلك يتم استخدام الطبقة الكثيفة (dense layer) لتغيير أبعاد المتجهات باستخدام كل خلية عصبية.
فلذلك يمكننا القول بأنه إذا كانت الطبقة السابقة تنتج مصفوفة (M × N) من خلال دمج النتائج من كل خلية عصبية، فإن هذا الناتج يمر عبر الطبقة الكثيفة إذ يجب أن يكون عدد الخلايا العصبية في طبقة كثيفة N. يمكننا تنفيذه باستخدام Keras، في الجزء التالي من المقالة سنرى بعض المعلمات الرئيسية للطبقة الكثيفة باستخدام Keras مع تعريفاتها.
الطبقة الكثيفة (Dense layer) من Keras
توفر Keras الطبقات الكثيفة من خلال البنية التالية:
tf.keras.layers.Dense( units, activation=None, use_bias=True, kernel_initializer="glorot_uniform", bias_initializer="zeros", kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs )
المعلمات الفائقة (hyperparameter) للطبقة الكثيفة في كيراس (keras)
Units
الوحدات (Units) هي واحدة من أكثر المعلمات الأساسية والضرورية لطبقة Keras الكثيفة التي تحدد حجم الناتج من الطبقة الكثيفة. ويجب أن يكون عددًا صحيحًا موجبًا لأنه يمثل أبعاد متجه الإخراج.
التفعيل (activation)
في الشبكات العصبية، تعد دالة التفعيل دالة تُستخدم لتحويل قيم إدخال الخلايا العصبية. أساسا، يقدم اللاخطية في شبكات الشبكات العصبية بحيث يمكن للشبكات معرفة العلاقة بين قيم الإدخال والإخراج.
إذا لم يتم تعريف التفعيل في طبقة Keras هذه، فسيتم النظر في وظيفة التفعيل الخطي. الخيارات التالية متاحة كدالات تفعيل في Keras.
- دالة Relu (التفعيل = activations.relu) – دالة التفعيل الوحدة الخطية المصححة (rectified linear unit activation function).
- الدالة السينية (sigmoid function) (التفعيل = activation.sigmoid).
- دالة Softmax (التفعيل = activations.softmax) – تحول softmax متجهًا للقيمة إلى توزيع احتمالي (probability distribution).
- دالة Softplus (التفعيل = Activations.softplus) – دالة تفعيل Softplus:
Softplus = log(exp(x) + 1)
5. دالة Softsign (التفعيل = Activations. Softsign) – دالة تفعيل Softsign:
Softsign = x / (abx(x) + 1)
6. دالة Tanh (التفعيل = activation.tanh) – دالة تفعيل الظل الزائدي (hyperbolic tangent activation function).
7. دالة Selu (التفعيل = activations.selu) – الوحدة الخطية المتدرجة (SELU).
8. دالة Elu (التفعيل = activations.elu) – الوحدة الخطية الأسية (Exponential Linear Unit).
9. الدالة الأسية (التفعيل = activations.exponential) – دالة التفعيل الأسية (Exponential Activation function).
use_bias
يتم استخدام معلمة Use_Bias لتحديد ما إذا كنا نريد طبقة كثيفة تستخدم متجه التحيز (bias vector) أم لا. وإنها معلمة منطقية إذا لم يتم تحديدها، فسيتم تعيين use_bias على true.
kernel_initializer
تستخدم هذه المعلمة لتهيئة مصفوفة أوزان النواة (kernel weights matrix). مصفوفة الوزن عبارة عن مصفوفة من الأوزان يتم ضربها في الإدخال لاستخراج نواة الميزة ذات الصلة.
bias_initializer
يتم استخدام هذه المعلمة لتهيئة متجه التحيز (bias vector). يمكن تعريف متجه التحيز على أنه مجموعات الوزن الإضافية التي لا تتطلب أي إدخال وتتوافق مع طبقة الإخراج. افتراضيا، يتم تعيينه على أنه أصفار.
منظم النواة (Kernel regularizer)
يتم استخدام هذه المعلمة لتنظيم مصفوفة وزن النواة إذا قمنا بتهيئة أي مصفوفة في kernal_initializer.
bias_regularizer
يتم استخدام هذه المعلمة لتنظيم متجه التحيز إذا قمنا بتهيئة أي متجه في bias_initializer. افتراضيا، يتم تعيينه على أنه لا شيء.
Activity_regularizer
تُستخدم هذه المعلمة لتنظيم دالة التفعيل التي حددناها في معلمة التفعيل. ويتم تطبيقه على إخراج الطبقة. افتراضيا، يتم تعيينه على أنه لا شيء.
kernal_constraint
تُستخدم هذه المعلمة لتطبيق دالة القيد (constraint function) على مصفوفة وزن النواة. افتراضيا، يتم تعيينه على أنه لا شيء.
Bias_constraint
تُستخدم هذه المعلمة لتطبيق دالة القيد (constraint function) على متجه التحيز (bias vector). افتراضيا، يتم تعيينه على أنه لا شيء.
العمليات الأساسية بطبقة كثيفة (dense layer)
كما رأينا في المعلمات، لدينا ثلاث سمات رئيسية: دالة التفعيل ومصفوفة الوزن ومتجه التحيز. يمكن باستخدام هذه الخصائص، تمثيل عملية الطبقة الكثيفة (dense layer) على النحو التالي:
الإخراج = التنشيط (نقطة (إدخال، نواة) + تحيز)
بحيث إذا كانت مصفوفة الإدخال للطبقة الكثيفة تحتوي على مرتبة أكثر من 2، فقم بوضع حاصل الضرب بين النواة والمدخل على طول المحور الأخير للإدخال والمحور الصفري للنواة باستخدام tf.tensordot المحسوب بواسطة الطبقة الكثيفة إذا كان use_bias خطأ.
كيف يتم تنفيذ الطبقة الكثيفة (dense layer)؟
سنرى في هذا القسم من المقالة، كيفية تنفيذ الطبقة الكثيفة في شبكة عصبية ذات طبقة كثيفة واحدة وشبكة عصبية ذات طبقات كثيفة متعددة.
نموذج متسلسل بطبقة كثيفة واحدة.
import tensorflow model = tensorflow.keras.models.Sequential() model.add(tensorflow.keras.Input(shape=(16,))) model.add(tensorflow.keras.layers.Dense(32, activation='relu')) print(model.output_shape) print(model.compute_output_signature)
الإخراج:

يمكننا في الإخراج، أن نرى أن ناتج النموذج بحجم (لا شيء، 32) ونحن نستخدم طبقة Keras واحدة وتوقيع الناتج من النموذج هو كائن متسلسل.

تمثل الصورة أعلاه، الشبكة العصبية بطبقة مخفية واحدة. وإذا اعتبرنا أن الطبقة المخفية هي الطبقة الكثيفة، فيمكن أن تمثل الصورة الشبكة العصبية بطبقة كثيفة واحدة.
نموذج متسلسل بطبقتين كثيفتين:
model1 = tensorflow.keras.models.Sequential() model1.add(tensorflow.keras.Input(shape=(16,))) model1.add(tensorflow.keras.layers.Dense(32, activation='relu')) model1.add(tensorflow.keras.layers.Dense(32)) print(model1.output_shape) print(model1.layers) print(model1.compute_output_signature)
الإخراج:

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

تمثل الصورة أعلاه الشبكة العصبية بطبقة مخفية واحدة. إذا اعتبرنا الطبقة المخفية هي الطبقة الكثيفة، يمكن أن تمثل الصورة الشبكة العصبية ذات الطبقات الكثيفة المتعددة.
في النموذج، نعطي مدخلات بالحجم (لا شيء، 16) للطبقة الكثيفة ونطلب من الطبقة الكثيفة توفير صفيف الإخراج للشكل (32، لا شيء) باستخدام معلمة الوحدات كـ 32، أيضًا في كلا النموذجين المتسلسلين يستخدمان دالة تفعيل ReLU.
إذا كان الإدخال الخاص بطبقة كثيفة (dense layer) ذو شكل (حجم_دفعة (batch_size)، …، إدخال ابعاد (input dim))، فسيكون الناتج من الطبقة الكثيفة الشكل (حجم الدُفعة، الوحدات (units)).
ملاحظة – الطبقة الكثيفة هي طبقة إدخال لأنه بعد استدعاء الطبقة لا يمكننا تغيير السمات، لأن شكل الإدخال للطبقة الكثيفة الذي يمر عبر الطبقة الكثيفة يحدد Keras طبقة الإدخال قبل الطبقة الكثيفة الحالية.
الكلمة الأخيرة
رأينا في هذا المقال، ما هو الحدس وراء الطبقة الكثيفة. ورأينا أيضًا كيف يمكن تنفيذه باستخدام Keras. ونظرنا إلى المعلمات الفائقة لطبقة Keras الكثيفة وفهمنا أهميتها. ونظرًا لأنها جزء أساسي من أي شبكة عصبية، فيجب أن تكون لدينا معرفة حول الطبقات الأساسية المختلفة جنبًا إلى جنب مع الطبقة الكثيفة.
This article is useful for me
1+ 3 People like this post