لا تستخدم Flatten () - التجميع العالمي لشبكات CNN مع ذكاء بيانات TensorFlow و Keras PlatoBlockchain. البحث العمودي. عاي.

لا تستخدم Flatten () - التجميع العالمي لشبكات CNN مع TensorFlow و Keras

يتعلم معظم الممارسين ، أثناء تعلمهم لأول مرة عن بنيات الشبكة العصبية التلافيفية (CNN) ، أنها تتكون من ثلاثة أقسام أساسية:

  • طبقات تلافيفية
  • طبقات التجميع
  • طبقات متصلة بالكامل

معظم الموارد لها بعض الاختلاف في هذا التقسيم ، بما في ذلك كتابي الخاص. خاصة عبر الإنترنت - تشير الطبقات المتصلة بالكامل إلى أ طبقة تسطيح و (عادة) متعددة طبقات كثيفة.

كان هذا هو المعيار ، وقد استخدمت البنى المعروفة مثل VGGNets هذا النهج ، وستنتهي بـ:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

رغم ذلك ، لسبب ما - غالبًا ما يُنسى أن VGGNet كانت عمليًا آخر بنية تستخدم هذا النهج ، بسبب الاختناق الحسابي الواضح الذي يخلقه. بمجرد نشر ResNets بعد عام واحد فقط من VGGNets (وقبل 7 سنوات) ، أنهت جميع البنى السائدة تعريفاتها النموذجية بـ:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

لقد ظل التسطيح في شبكات CNN مستمراً لمدة 7 سنوات. 7 سنة! ولا يبدو أن عددًا كافيًا من الناس يتحدثون عن التأثير الضار لذلك على تجربة التعلم الخاصة بك والموارد الحسابية التي تستخدمها.

يُفضل تجميع المتوسط ​​العالمي في العديد من الحسابات بدلاً من التسوية. إذا كنت تقوم بعمل نسخة أولية من شبكة CNN صغيرة - فاستخدم Global Pooling. إذا كنت تعلم شخصًا ما عن شبكات CNN - فاستخدم Global Pooling. إذا كنت تقوم بعمل MVP - استخدم Global Pooling. استخدم طبقات التسطيح لحالات الاستخدام الأخرى حيث تكون هناك حاجة فعلية إليها.

دراسة حالة - التسطيح مقابل التجميع العالمي

يقوم Global Pooling بتكثيف كل خرائط المعالم في خريطة واحدة ، حيث يتم تجميع كل المعلومات ذات الصلة في خريطة واحدة يمكن فهمها بسهولة بواسطة طبقة تصنيف كثيفة واحدة بدلاً من طبقات متعددة. يتم تطبيقه عادةً كمتوسط ​​تجميع (GlobalAveragePooling2D) أو أقصى تجمع (GlobalMaxPooling2D) ويمكن أن تعمل أيضًا من أجل الإدخال أحادي الأبعاد وثلاثي الأبعاد.

بدلاً من تسطيح خريطة المعالم مثل (7, 7, 32) في متجه بطول 1536 وتدريب طبقة واحدة أو عدة طبقات لتمييز الأنماط من هذا المتجه الطويل: يمكننا تكثيفه في (7, 7) ناقلات وتصنيفها مباشرة من هناك. بكل بساطة!

لاحظ أن طبقات عنق الزجاجة لشبكات مثل ResNets تعد بعشرات الآلاف من الميزات ، وليس مجرد 1536 ميزة. عند التسطيح ، فإنك تعذب شبكتك للتعلم من المتجهات ذات الشكل الغريب بطريقة غير فعالة للغاية. تخيل صورة ثنائية الأبعاد يتم تقطيعها إلى شرائح في كل صف بكسل ثم يتم تجميعها في متجه مسطح. البكسلان اللذان كانا يفصل بينهما 2 بكسل عموديًا غير كذلك feature_map_width بكسل أفقيا! في حين أن هذا قد لا يهم كثيرًا بالنسبة لخوارزمية التصنيف ، التي تفضل الثبات المكاني - إلا أن هذا لن يكون جيدًا من الناحية المفاهيمية للتطبيقات الأخرى للرؤية الحاسوبية.

دعنا نحدد شبكة توضيحية صغيرة تستخدم طبقة تسطيح بطبقتين كثيفتين:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

كيف يبدو الملخص؟

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

11.5M معلمات لشبكة لعبة - وشاهد المعلمات تنفجر بمدخلات أكبر. 11.5M المعلمات. تعمل شبكة EfficientNets ، وهي واحدة من أفضل الشبكات أداءً على الإطلاق ، والتي تعمل في حوالي 6 ملايين من المعلمات ، ولا يمكن مقارنتها بهذا النموذج البسيط من حيث الأداء الفعلي والقدرة على التعلم من البيانات.

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

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

إليك شبكة ذات تجميع عالمي:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

ملخص؟

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

أفضل بكثير! إذا تعمقنا مع هذا النموذج ، سيزداد عدد المعلمات ، وقد نتمكن من التقاط أنماط أكثر تعقيدًا من البيانات باستخدام الطبقات الجديدة. إذا تم ذلك بسذاجة ، فستظهر نفس المشكلات التي ارتبطت بشبكة VGGNets.

المضي قدمًا - مشروع باليد من البداية إلى النهاية

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من مشروع موجه: "الشبكات العصبية التلافيفية - ما وراء البنى الأساسية".

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

سآخذك في جولة قصيرة من السفر عبر الزمن - من 1998 إلى 2022 ، لتسليط الضوء على البنى المحددة التي تم تطويرها على مر السنين ، وما الذي جعلها فريدة من نوعها ، وما هي عيوبها ، وتنفيذ أبرزها من الصفر. لا يوجد شيء أفضل من وجود بعض الأوساخ على يديك عندما يتعلق الأمر بهذه الأشياء.

يمكنك قيادة السيارة دون معرفة ما إذا كان المحرك يحتوي على 4 أو 8 أسطوانات وما هو موضع الصمامات داخل المحرك. ومع ذلك - إذا كنت ترغب في تصميم محرك (نموذج رؤية الكمبيوتر) وتقديره ، فستحتاج إلى التعمق قليلاً. حتى إذا كنت لا ترغب في قضاء الوقت في تصميم البنى وترغب في إنشاء منتجات بدلاً من ذلك ، وهو ما تريد فعله كثيرًا - ستجد معلومات مهمة في هذا الدرس. ستتعرف على سبب إضرار استخدام البنى القديمة مثل VGGNet بمنتجك وأدائك ، ولماذا يجب عليك تخطيها إذا كنت تبني أي شيء حديث ، وستتعرف على البنى التي يمكنك الذهاب إليها لحل المشكلات العملية وماذا الإيجابيات والسلبيات لكل منها.

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

أنت لا إلى Google للهياكل وتطبيقاتها - عادة ما يتم شرحها بوضوح شديد في الأوراق ، وأطر عمل مثل Keras تجعل هذه التطبيقات أسهل من أي وقت مضى. تتمثل الخطوة الرئيسية لهذا المشروع الموجه في تعليمك كيفية العثور على البنى والأوراق وقراءتها وتنفيذها وفهمها. لن يتمكن أي مورد في العالم من مواكبة أحدث التطورات. لقد قمت بتضمين أحدث الأوراق هنا - ولكن في غضون بضعة أشهر ، ستظهر أوراق جديدة ، وهذا أمر لا مفر منه. إن معرفة مكان العثور على تطبيقات موثوقة ومقارنتها بالأوراق وتعديلها يمكن أن يمنحك الميزة التنافسية المطلوبة للعديد من منتجات رؤية الكمبيوتر التي قد ترغب في بنائها.

وفي الختام

في هذا الدليل المختصر ، ألقينا نظرة على بديل للتسطيح في تصميم هندسة CNN. وإن كان قصيرًا - يعالج الدليل مشكلة شائعة عند تصميم النماذج الأولية أو MVPs ، وينصحك باستخدام بديل أفضل للتسوية.

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

إذا كنت تدخل في رؤية الكمبيوتر - فافعل لنفسك معروفًا ولا تستخدم طبقات التسطيح قبل رؤساء التصنيف في رحلة التعلم الخاصة بك.

الطابع الزمني:

اكثر من ستاكابوز