البرمجة

تحليل مشاكل الأبعاد في CNN باستخدام Keras

عند بناء شبكة عصبية تابعة للتصنيف الصور باستخدام Keras، قد تواجه بعض التحديات التي قد تبدو غير واضحة في البداية. في البداية، يظهر أن هناك بعض الارتباك حول شكل البيانات الخاص بك وكيفية تحديده في الشبكة. دعونا نقم بتفكيك المشكلات وإيضاحها.

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

إذا كنت ترغب في تحليل الجمل ككل، فيمكنك تنظيم بيانات الإدخال الخاصة بك بحيث تكون أبعاد البيانات هي (عدد الكلمات في الجملة، أبعاد الكلمة)، وبالتالي تكون input_shape=(عدد الكلمات في الجملة، أبعاد الكلمة، 1) لتوضيح أن هناك بُعد إضافي.

لحل مشكلة “expected ndim=4” يمكنك تحديد input_shape=(عدد الكلمات في الجملة، أبعاد الكلمة، 1) في طبقة Convolution2D.

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

يمكنك استخدام Flatten layer بعد ال Convolution2D لتسطيح البيانات وجعلها ثنائية الأبعاد قبل إدخالها إلى الطبقة التالية. يمكنك إضافة الشيفرة التالية:

python
model.add(Flatten())

هذا يقوم بتسطيح البيانات وتحويلها إلى متجه ثنائي الأبعاد.

باختصار، لتصحيح مشكلتك، يمكنك تنظيم بيانات الإدخال لتكون بأبعاد مناسبة واستخدام Flatten layer لتسطيح البيانات قبل طبقة التنشيط.

المزيد من المعلومات

لفهم الوضع بشكل أفضل، دعونا نوسع على بعض النقاط الرئيسية التي قد تكون مفيدة في فهم تحدياتك مع بناء شبكة Convolutional Neural Network (CNN) باستخدام Keras.

أولًا، عند تحديد input_shape في طبقة Convolution2D، يجب أن تكون أبعاد البيانات متوافقة مع توقعات الطبقة. في مثالك، إذا كانت كل جملة تتكون من 100 كلمة، وكل كلمة هي متجه ذو 100 أبعاد، فإن شكل البيانات يجب أن يكون (100, 100, 1) إذا كنت تريد معالجة الجمل ككل.

python
Convolution2D(10, 3, 3, border_mode='same', input_shape=(100, 100, 1))

في هذا السياق، يجب أن تكون البيانات بشكل ثلاثي الأبعاد (وهي الحال عندما تُضاف البُعد الإضافي باستخدام input_shape=(100, 100, 1)) لتتناسب مع تصميم الطبقات الثنائية الأبعاد في CNN.

ثانيًا، بعد ال Convolutional layer، يُفضل عادةً إضافة طبقة تسطيح باستخدام Flatten() لتحويل البيانات إلى متجه ذو بُعدين قبل إدخالها إلى الطبقة التالية. ذلك لأن طبقة الـ Softmax التي تستخدم للتصنيف تتوقع بُعدًا ثنائي الأبعاد. قد يكون ذلك بسبب الطريقة التي يتم فيها تصميم الشبكة الخاصة بك.

python
model.add(Flatten())

هذه الطبقة تقوم بفك البيانات إلى متجه ذو بُعدين، وبالتالي يصبح من الممكن إضافة الطبقات الأخرى بشكل صحيح.

لفهم تفصيل أفضل حول تصميم النموذج وتحديد الأبعاد بشكل صحيح، يمكن استعراض كامل النموذج أو الجزء الذي يسبب المشاكل. ذلك يساعد في توفير مساعدة دقيقة وفعّالة.

زر الذهاب إلى الأعلى