وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

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

0 1
زمان لازم برای مطالعه: 4 دقیقه


اکثر پزشکان، در حالی که برای اولین بار در مورد معماری شبکه عصبی کانولوشنال (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) و می تواند برای ورودی 1 بعدی و 3 بعدی نیز کار کند.

به جای مسطح کردن یک نقشه ویژگی مانند (7, 7, 32) در یک بردار به طول 1536 و آموزش یک یا چند لایه برای تشخیص الگوها از این بردار طولانی: می‌توانیم آن را به یک بردار متراکم کنیم. (7, 7) بردار و مستقیماً از آنجا طبقه بندی کنید. ساده است!

توجه داشته باشید که لایه‌های تنگنا برای شبکه‌هایی مانند ResNets دارای ده‌ها هزار ویژگی هستند، نه فقط 1536. هنگام صاف کردن، شبکه خود را شکنجه می‌دهید تا از بردارهای عجیب و غریب به شیوه‌ای بسیار ناکارآمد یاد بگیرید. تصور کنید یک تصویر دوبعدی بریده شده است روی هر ردیف پیکسل و سپس به یک بردار مسطح الحاق می شود. دو پیکسلی که قبلاً به صورت عمودی 0 پیکسل از هم فاصله داشتند، نیستند 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 را محدود می کند به وجود می آید.

نتیجه

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

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

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

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-03 23:07:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید