از Flatten() استفاده نکنید - ادغام جهانی برای CNN با TensorFlow و Keras PlatoBlockchain Intelligence Data. جستجوی عمودی Ai.

از Flatten() استفاده نکنید – جمع‌بندی جهانی برای CNN با TensorFlow و Keras

اکثر پزشکان، در حالی که برای اولین بار در مورد معماری شبکه عصبی کانولوشن (CNN) یاد می‌کنند، یاد می‌گیرند که از سه بخش اصلی تشکیل شده است:

  • لایه های کانولوشنال
  • لایه های ترکیبی
  • لایه های کاملاً متصل

اکثر منابع دارند برخی از تنوع در این تقسیم بندی، از جمله کتاب خودم. مخصوصاً آنلاین – لایه‌های کاملاً متصل به a لایه مسطح و (معمولا) متعدد لایه های متراکم.

قبلاً این یک هنجار بود و معماری های معروفی مانند 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) و می تواند برای ورودی 1 بعدی و 3 بعدی نیز کار کند.

به جای مسطح کردن یک نقشه ویژگی مانند (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.5 میلیون پارامتر برای یک شبکه اسباب بازی – و شاهد انفجار پارامترها با ورودی بزرگتر باشید. پارامترهای 11.5M. EfficientNets، یکی از بهترین شبکه هایی است که تا به حال با پارامترهای ~6M طراحی شده است و از نظر عملکرد واقعی و ظرفیت یادگیری از داده ها با این مدل ساده قابل مقایسه نیست.

ما می‌توانیم با عمیق‌تر کردن شبکه، این عدد را به‌طور قابل‌توجهی کاهش دهیم، که حداکثر تجمع بیشتر (و کانولوشن بالقوه گام‌به‌گام) را برای کاهش نقشه‌های ویژگی قبل از مسطح شدن معرفی می‌کند. با این حال، در نظر بگیرید که ما می‌خواهیم شبکه را پیچیده‌تر کنیم تا از نظر محاسباتی هزینه کمتری داشته باشیم، همه اینها به خاطر یک لایه واحد که آچاری را در برنامه‌ها می‌اندازد.

عمیق‌تر رفتن با لایه‌ها باید برای استخراج روابط معنی‌دارتر و غیر خطی‌تر بین نقاط داده باشد، نه کاهش اندازه ورودی برای پاسخگویی به یک لایه مسطح.

در اینجا یک شبکه با ادغام جهانی وجود دارد:

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 را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!

من شما را کمی به سفر در زمان می برم – از سال 1998 تا 2022 می رویم، معماری های تعیین کننده ای را که در طول سال ها توسعه یافته اند برجسته می کنم، آنچه که آنها را منحصر به فرد کرده است، معایب آنها چیست، و موارد قابل توجه را از ابتدا اجرا می کنم. وقتی صحبت از اینها می شود، هیچ چیز بهتر از این نیست که مقداری خاک روی دستانتان باشد.

شما می توانید بدون اینکه بدانید موتور دارای 4 یا 8 سیلندر است و محل قرارگیری سوپاپ ها در داخل موتور خودرو را رانندگی کنید. با این حال – اگر می خواهید یک موتور (مدل دید کامپیوتری) را طراحی و قدردانی کنید، باید کمی عمیق تر بروید. حتی اگر نمی خواهید زمان خود را صرف طراحی معماری کنید و می خواهید به جای آن محصولاتی بسازید، این همان کاری است که بیشتر افراد می خواهند انجام دهند - اطلاعات مهمی را در این درس خواهید یافت. شما خواهید آموخت که چرا استفاده از معماری های قدیمی مانند VGGNet به محصول و عملکرد شما آسیب می رساند، و چرا اگر در حال ساخت هر چیزی مدرن هستید، باید از آنها صرف نظر کنید، و خواهید آموخت که برای حل مشکلات عملی و چه چیزی می توانید به کدام معماری مراجعه کنید. مزایا و معایب برای هر کدام است.

اگر به دنبال استفاده از بینایی کامپیوتر در رشته خود هستید، با استفاده از منابع این درس - می‌توانید جدیدترین مدل‌ها را بیابید، بدانید که چگونه کار می‌کنند و با چه معیارهایی می‌توانید آنها را مقایسه کنید و تصمیم بگیرید که کدام یک استفاده کنید.

شما کار را انجام ندهید برای معماری‌ها و پیاده‌سازی‌های آن‌ها باید به گوگل مراجعه کنید – معمولاً به وضوح در مقالات توضیح داده شده‌اند، و چارچوب‌هایی مانند Keras این پیاده‌سازی‌ها را آسان‌تر از همیشه می‌کنند. نکته کلیدی این پروژه هدایت شده این است که به شما یاد دهد چگونه معماری ها و مقالات را پیدا کنید، بخوانید، پیاده سازی کنید و درک کنید. هیچ منبعی در جهان قادر نخواهد بود با همه جدیدترین پیشرفت‌ها هماهنگی داشته باشد. من جدیدترین مقالات را در اینجا گنجانده ام - اما در عرض چند ماه، مقالات جدید ظاهر می شوند، و این اجتناب ناپذیر است. دانستن اینکه کجا می توانید پیاده سازی های معتبر را پیدا کنید، آنها را با مقالات مقایسه کنید و آنها را تغییر دهید، می تواند مزیت رقابتی مورد نیاز برای بسیاری از محصولات بینایی کامپیوتری را که ممکن است بخواهید بسازید، به شما بدهد.

نتیجه

در این راهنمای کوتاه، ما نگاهی به جایگزینی برای مسطح کردن در طراحی معماری CNN انداخته‌ایم. هرچند کوتاه – این راهنما به یک مسئله رایج در هنگام طراحی نمونه‌های اولیه یا MVP اشاره می‌کند و به شما توصیه می‌کند که از جایگزین بهتری برای مسطح کردن استفاده کنید.

هر مهندس باتجربه بینایی کامپیوتر این اصل را می‌داند و به کار می‌برد، و این عمل مسلم تلقی می‌شود. متأسفانه، به نظر نمی‌رسد که به درستی به تمرین‌کنندگان جدیدی که تازه وارد میدان می‌شوند، منتقل شود و می‌تواند عادت‌های چسبنده‌ای ایجاد کند که خلاص شدن از آن مدتی طول می‌کشد.

اگر در حال ورود به کامپیوتر ویژن هستید - به خودتان لطف کنید و قبل از سرفصل های طبقه بندی در سفر یادگیری خود از لایه های صاف کننده استفاده نکنید.

تمبر زمان:

بیشتر از Stackabuse