Padding و Stride در شبکه‌های CNN

Padding

Padding مربوط به شبکه‌های عصبی کانولوشنی است و به تعداد پیکسل‌هایی گفته می‌شود که هنگام پردازش تصویر در Kernel به عکس اضافه می‌شود. Kernel فیلتر شبکه‌های عصبی است که در سراسر تصویر حرکت می‌کند؛ هر پیکسل را اسکن می‌کند و داده‌ها را به یک قالب کوچک‌تر یا گاهی بزرگ‌تر تبدیل می‌کند.

اگر Padding در یک شبکه‌ی کانولوشنی برابر صفر تنظیم شود سپس هر مقدار پیکسلی که به عکس اضافه شود برابر صفر خواهد بود. به منظور کمک به Kernel در پردازش تصویر، Padding به فریم تصویر اضافه می‌شود تا فضای بیشتری برای Kernel در پوشش تصویر فراهم کند. افزودن Padding به تصویری که توسط CNN پردازش می‌شود؛ امکان تجزیه‌وتحلیل دقیق‌تر تصاویر را فراهم می‌کند.

در تصویر زیر ورودی اولیه 3*3 را به 5*5 تبدیل می‌کنیم. سپس خروجی مربوطه به یک ماتریس 4*4  افزایش پیدا می‌کند.

 

padding
شکل1. همبستگی متقابل دو بعدی با Padding. بخش رنگی ورودی و عناصر آرایه‌ی Kernel است که اولین عنصر خروجی را نتیجه می‌دهد: 0×0+0×1+0×2+0×3=0

 

به‌طورکلی اگر شکل ورودی به‌صورت $$n_{h} \times n_{w}$$ و شکل Kernel به‌صورت $$k_{h} \times k_{w}$$ باشد؛ شکل خروجی به‌صورت زیر است:

\begin{equation}\left(n_{h}-k_{h}+1\right) \times\left(n_{w}-k_{w}+1\right)\end{equation}

و اگر Padding را به اندازه‌ی $$p_{h}$$ ردیف (نیمی از بالا و نیمی از پایین) و $$p_{w}$$ ستون (نیمی از راست و نیمی از چپ) اضافه کنیم آنگاه شکل خروجی به‌صورت زیر خواهد بود:

\begin{equation}\left(n_{h}-k_{h}+p_{h}+1\right) \times\left(n_{w}-k_{w}+p_{w}+1\right)\end{equation}

و به این معنا است که طول و عرض خروجی با $$p_{h}$$ و $$p_{w}$$ افزایش می‌یابد.

در مثال زیر، یک لایه Padding دو بعدی با طول و عرض 3 ایجاد می‌کنیم و 1 پیکسل Padding را از همه طرف اعمال می‌کنیم. با توجه به یک ورودی با طول و عرض 8، درمی‌یابیم که طول و عرض خروجی نیز 8 است.

import torch
from torch import nn

def comp_conv2d(conv2d, X)
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    return Y.reshape(Y.shape[2:])

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape

 

هنگامی‌که ارتفاع و عرض Kernel متفاوت است؛ می‌توانیم با تنظیم اعداد مختلف Padding برای ارتفاع و عرض، خروجی و ورودی را با ارتفاع و عرض یکسان بسازیم.

conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape

 

Stride

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

Stride یا گام به تعداد ردیف‌ها و ستون‌های پیموده شده در هر بخش گفته می‌شود. تاکنون گام را یک در نظر می‌گرفتیم. گاهی اوقات مجبور هستیم از گام بزرگ‌تری استفاده کنیم. شکل 2 همبستگی متقابل دو بعدی را با 3 گام در جهت عمودی و 2 گام در جهت افقی نشان می‌دهد. می‌بینیم وقتی عنصر دوم ستون اول در حال ساختن خروجی است؛ پنجره کانولوشن سه ردیف پایینتر می‌رود. در هنگام ایجاد خروجی از عنصر دوم ردیف اول، پنجره کانولوشن دو ستون به سمت راست حرکت می‌کند. هنگامی‌که پنجره کانولوشن در ورودی، سه ستون به سمت راست حرکت می‌کند؛ هیچ‌گونه خروجی تولید نمی‌شود زیرا عنصر ورودی نمی‌تواند پنجره کانولوشن را پر کند (مگر اینکه ما یک ستون دیگر از Padding اضافه کنیم).

 

stride
شکل2. همبستگی متقابل دو بعدی با دو گام در جهت افقی و سه گام در جهت عمودی. بخش رنگی عنصر خروجی و عناصر آرایه ورودی و Kernel است که در محاسبات استفاده می‌شود: 0×0+0×1+1×2+2×3=8, 0×0+6×1+0×2+0×3=6

 

در مثال زیر گام را برای ارتفاع و عرض برابر 2 در نظر می‌گیریم:

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape

 

در مرحله بعد، به یک مثال کمی پیچیده‌تر می‌پردازیم:

conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape

 

Padding می‌تواند ارتفاع و عرض خروجی را افزایش دهد. این امر اغلب به دلیل گرفتن خروجی با ارتفاع و عرض ورودی است. Stride می‌تواند وضوح خروجی را کاهش دهد. از هر دوی Padding و Stride در جهت تنظیم ابعاد داده‌ها استفاده می‌شود.

ارسال یک پاسخ

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