GAP : Global Average Pooling

 

مقدمه : pooling و انواع رایج آن

در CNNs، لایه‌های pooling معمولاً برای کاهش ابعاد فضایی نقشه‌های ویژگی ورودی و به حداقل رساندن پیچیدگی محاسباتی و تعداد پارامترهای شبکه استفاده می‌شوند. متداول‌ترین روش‌های pooling شامل max pooling است که حداکثر مقدار در هر ناحیه pooling را می‌گیرد، و average pooling که میانگین مقدار را محاسبه می‌کند.  

Global Average Pooling چیست؟

Global Average Pooling یا GAP یک عملیات ادغام است که معمولاً در شبکه‌های عصبی کانولوشنی (CNNs) استفاده می‌شود. این به منظور جایگزین کردن لایه‌های کاملاً متصل (fully connected layers) در معماری‌های کلاسیک CNN طراحی شده است. ایده اصلی در Global Average Pooling این است که در آخرین لایه کانولوشنی میانگین هر نقشه ویژگی (feature map) را بگیرد وبرای هر نقشه ویژگی یک مقدار به دست می‌آید.

کد اول : آشنایی با کارکرد Pooling

import numpy as np
from tensorflow.keras.layers import MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D

my_img = np.array([[4.,7,3,1],
                   [1,5,2,3],
                   [6,3,9,2],
                   [1,6,3,7]])

input_img = my_img[np.newaxis,:,:,np.newaxis]

max_pool = MaxPooling2D(pool_size=(2, 2))(input_img)
max_pool = max_pool.numpy()
print(max_pool.shape)
print(max_pool)

avg_pool = AveragePooling2D(pool_size=(2, 2))(input_img)
avg_pool = avg_pool.numpy()
print(avg_pool.shape)
print(avg_pool)

GAP = GlobalAveragePooling2D()(input_img)
GAP = GAP.numpy()
print(GAP.shape)
print(GAP)

print(my_img.mean())

کاربرد GAP

Global Average Pooling معمولاً برای جایگزینی لایه‌های flatten و dense به کار می‌روند. مدل‌ها معمولاً با لایه‌های کانولوشن به پایان می‌رسند و سپس لایه GAP اجرا می‌شود و هر نقشه ویژگی را به یک عدد تبدیل می‌کند. که این مقادیر به صورت مستقیم به لایه softmax برای طبقه‌بندی وارد می‌شوند. به عبارت دیگر، با محاسبه میانگین، اطلاعات فضایی (sptial information) به یک مقدار برای هر نقشه ویژگی کاهش می‌یابد.

کد دوم : استفاده در لایه های شبکه عصبی

avg_pool_model = Sequential()

avg_pool_model.add(Conv2D(32, (3, 3), input_shape=INPUT_SHAPE))
avg_pool_model.add(Activation('relu'))
avg_pool_model.add(MaxPooling2D(pool_size=(2, 2)))

avg_pool_model.add(Conv2D(32, (3, 3), kernel_initializer = 'he_uniform'))
avg_pool_model.add(Activation('relu'))
avg_pool_model.add(MaxPooling2D(pool_size=(2, 2)))

avg_pool_model.add(Conv2D(64, (3, 3), kernel_initializer = 'he_uniform'))

avg_pool_model.add(GlobalAveragePooling2D())

#avg_pool_model.add(Flatten()) #No need for flattening anymore.
avg_pool_model.add(Dense(1))
avg_pool_model.add(Activation('sigmoid'))

مزایای Global Average Pooling

  • کاهش ابعاد

GAP در کاهش ابعاد فضایی نقشه‌های ویژگی ورودی به شدت تاثیرگذاراست و تعداد قابل توجهی از پارامترهای شبکه را نسبت به لایه‌های fully connected کاهش می‌دهد. این باعث می‌شود تا تعداد پارامترها و پیچیدگی محاسباتی شبکه به شدت کاهش یابد.
  • پیشگیری از Overfitting

با کاهش تعداد پارامترها، احتمال overfitting نیز به شدت کاهش می‌یابد، که به مدل کمک می‌کند بهتر برای داده‌های جدید عمل کند.
  • حفظ اطلاعات مهم

گرفتن میانگین در سراسر نقشه‌های ویژگی باعث حفظ اطلاعات مهم در هر نقطه از تصویر می‌شود، که برای وظایفی مانند دسته‌بندی تصویر و تشخیص اشیاء حیاتی است.
  • سهولت در پیاده‌سازی

اضافه کردن لایه GAP به شبکه به نسبت ساده است و نیاز به تنظیم تعداد اتصالات و پارامترها ندارد، که به توسعه‌دهندگان در پیاده‌سازی مدل‌های خود سهولت می‌دهد.  

سوالات چهار گزینه‌ای:

  • کدوم لایه در مدل avg_pool_model برای جایگزینی لایه‌های flatten و dense استفاده می‌شود؟
الف) MaxPooling2D ب) AveragePooling2D ج) Conv2D د) GlobalAveragePooling2D  
  • در مدل avg_pool_model، چه لایه‌ای برای حفظ اطلاعات مهم در هر نقطه از تصویر استفاده شده است؟
الف) MaxPooling2D ب) AveragePooling2D ج) Conv2D د) GlobalAveragePooling2D  
  • مقدار Global Average Pooling (GAP) چگونه به دست می‌آید؟
الف) انتخاب حداکثر مقدار در هر ناحیه. ب) میانگین مقدار در هر ناحیه محاسبه می‌شود. ج) تمام اعداد ماتریس جمع می‌شوند. د) ماتریس به یک عدد تبدیل می‌شود.  
  • کدام مورد از مزیت های Global Average Pooling (GAP) در شبکه‌های عصبی نیست؟
الف) کاهش تعداد پارامترها ب) حفظ اطلاعات مهم در هر نقطه از تصویر ج) افزایش ابعاد فضایی نقشه‌های ویژگی د) کاهش احتمال overfitting