Pooling Layer چیست؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

Pooling Layer چیست؟

+1 امتیاز

سلام مجدد.

Pooling Layer چیه و چه نقشی تو deep learning داره و بعد و قبل کدام لایه ها استفاده میشه؟

سوال شده فروردین 11, 1396  بوسیله ی مریم اکرمی (امتیاز 482)   25 55 66

3 پاسخ

+6 امتیاز
 
بهترین پاسخ

وقتی شما عملکرد لایه کانولوشن را یاد بگیرید درک لایه پولینگ برای شما راحته.در واقع هدف اصلیش subsample (کوچک کردن) تصویر ورودی به منظور کاهش بارمحاسباتی ، حافظه و تعداد پارامترها (کم کردن ریسک overfitting) است.کاهش اندازه تصویر ورودی همچنین باعث میشه که شبکه عصبی حساسیتش نسبت به جابجایی تصویر(مستقل از موقعیت) کم بشه.

درست مثل لایه کانولوشن هرنرون در لایه پولینگ  به خروجی تعداد محدودی از نرون ها در لایه قبلی متصل هستش در واقع  این نرون ها داخل یک receptive field مستطیلی شکل کوچک قرار گرفته اند.

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

شکل زیر لایه پولینگ از نوع ماکزیمم را به شما نشان میده در واقع این نوع از لایه پولینگ توی یادگیری عمیق متداول هستش. در این مثال اندازه کرنل 2*2 و stride هم 2 در نظر گرفته شده و padding هم نداریم.توجه داشته باشید که مقدار ماکزیمم در هر کرنل به خروجی ارسال میشه و دیگر ورودی ها صرف نظر میشه.

 

 

 

pooling layer

 

 

همانطور که مشاهده کردید این نوع لایه بسیار کاهنده است.با اندازه کرنل 2*2 و مقدار گام 2 اندازه تصویر خروجی در هر دو راستا نصف شد.به زبان ساده 75 درصد از تصویر دور ریخته شد.

در این حالت لایه پولینگ بر روی هر کانال به صورت مستقل عمل می کنه پس میشه نتیجه گرفت که عمق ورودی و خروجی با هم برابر باشه.البته حالت دیگری هم وجود داره زمانی که شما قصد ندارید ابعاد تصویر را تغییر بدید و در واقع شما قصد دارید عملیات تجمیع را بر روی کانال ها انجام بدید مثلا میانگین مقادیر rgb در 3 کانال.

پاسخ داده شده خرداد 25, 1396 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد خرداد 25, 1396 بوسیله ی مریم اکرمی
ممنون فرنوش جون لطف کردی من خودم تو بعضی از فیلتر های  پردازش تصویر از این نکنیک استفاده کردم الان متوجه شدم که تو یادگیری عمیق لایه پولینگ این کار را برای ما انجام میده.
+2 امتیاز

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

http://cs231n.github.io/convolutional-networks

پاسخ داده شده خرداد 25, 1396 بوسیله ی mlghost (امتیاز 75)   3
+3 امتیاز

مثالی از max-pool در تنسوفلو :

batch_size=1
input_height = 3
input_width = 3
input_channels = 1
layer_input = tf.constant([
[
[[1.0], [0.2], [1.5]],
[[0.1], [1.2], [1.4]],
[[1.1], [0.4], [0.4]]
]
])

kernel = [batch_size, input_height, input_width, input_channels]
max_pool = tf.nn.max_pool(layer_input, kernel, [1, 1, 1, 1], "VALID")
print(sess.run(max_pool))

#خروجی
[[[[ 1.5]]]]

max-pool

 

البته این مثالی که من قرار دادم روش padding ش VALID بود که شما SAME را هم می تونید استفاده کنید که تقاوت این دو روش در این پست بحث شده.

بعضی اوقات که نیاز برایند کلی receptive field را در هر بار اجرا داشته باشیم می تونیم از روش average pool استفاده کنیم.که در تنسورفلو به صورت زیر استفاده میشه.

 

batch_size=1
input_height = 3
input_width = 3
input_channels = 1
layer_input = tf.constant([
[
[[1.0], [1.0], [1.0]],
[[1.0], [0.5], [0.0]],
[[0.0], [0.0], [0.0]]
]
])

kernel = [batch_size, input_height, input_width, input_channels]
max_pool = tf.nn.avg_pool(layer_input, kernel, [1, 1, 1, 1], "VALID")
sess = tf.Session()
print(sess.run(max_pool))

#خروجی
[[[[ 0.5]]]]

 

avg_pool

 

پاسخ داده شده آبان 11, 1396 بوسیله ی asgari (امتیاز 147)   3 8 14
ویرایش شده آبان 11, 1396 بوسیله ی asgari
...