Swin Transformer یکی از مهمترین معماریهایی است که در سالهای اخیر دنیای بینایی ماشین را تغییر داده است. این مدل با هدف حل محدودیتهای Vision Transformer ساخته شد و توانست با کاهش هزینه محاسباتی attention، استفاده از Transformerها را برای پردازش تصاویر بزرگ و taskهای سنگینتر ممکن کند. به همین دلیل Swin Transformer خیلی سریع وارد پروژههای مهمی مثل تشخیص اشیا، سگمنتیشن تصاویر و حتی مدلهای چندوجهی شد و هنوز هم در بسیاری از معماریهای مدرن Computer Vision استفاده میشود.
همین طراحی باعث شد مدل علاوهبر سرعت بیشتر، حافظه کمتری مصرف کند و هم بتواند ساختاری سلسلهمراتبی شبیه CNNها بسازد. در این مقاله ابتدا بررسی میکنیم Swin Transformer دقیقا چگونه کار میکند، سپس معماری آن را مرحلهبهمرحله تحلیل میکنیم و در ادامه بخشهای اصلی آن را با PyTorch پیادهسازی خواهیم کرد؛ از Patch Partition و Patch Merging گرفته تا Shifted Window Attention و ساخت کامل Swin Transformer Block.
Swin Transformer چیست؟
Swin Transformer یک معماری مبتنی بر Transformer برای پردازش تصویر است که با هدف حل محدودیتهای Vision Transformer طراحی شد. مهمترین تفاوت Swin Transformer با مدلهای اولیه Transformer در بینایی ماشین این است که بهجای محاسبه attention روی کل تصویر، آن را به پنجرههای کوچکتر تقسیم میکند و attention را فقط داخل همان ناحیهها محاسبه میکند. این کار باعث میشود هزینه محاسباتی مدل به شکل قابل توجهی کاهش پیدا کند و امکان استفاده از Transformerها روی تصاویر با رزولوشن بالا فراهم شود.
یکی دیگر از ویژگیهای مهم Swin Transformer، ساختار سلسلهمراتبی یا Hierarchical آن است. برخلاف ViT که تقریبا در تمام لایهها اندازه feature map را ثابت نگه میدارد، Swin Transformer در هر stage رزولوشن تصویر را کاهش و تعداد channelها را افزایش میدهد؛ دقیقا مشابه کاری که CNNها انجام میدهند. همین موضوع باعث میشود Swin Transformer برای taskهایی مثل تشخیص تصویر و Semantic Segmentation عملکرد بسیار بهتری داشته باشد.
هسته اصلی این معماری بر پایه مکانیزمی به نام Shifted Window ساخته شده است. در این روش، پنجرههای attention بین لایهها جابهجا میشوند تا ارتباط بین بخشهای مختلف تصویر حفظ شود. بدون این جابهجایی، هر window فقط اطلاعات همان ناحیه محدود را میدید و مدل نمیتوانست ارتباط موثر بین پنجرهها برقرار کند.
یکی دیگر از دلایل محبوبیت Swin Transformer، کاهش پیچیدگی در محاسبه Self-Attention است. در Vision Transformer، هزینه attention با افزایش تعداد patchها بهصورت مربعی رشد میکند:
\( \Omega \left ( MSA \right )= 4hwC^{2}+2\left ( hw \right )^{2}C\)
اما در Swin Transformer، هر attention فقط داخل windowها محاسبه میشود و complexity تقریبا بهصورت خطی نسبت به اندازه تصویر رشد میکند:
\( \Omega \left ( MSA \right )= 4hwC^{2}+2M^{2}hwC\)
همین ایده باعث شد Swin Transformer بتواند هم دقت بالایی ارائه دهد و هم نسبت به بسیاری از معماریهای مبتنی بر attention سرعت و مقیاسپذیری بهتری داشته باشد.
محدودیتهای Vision Transformer و نیاز به معماری Swin Transformer
معرفی ViT نقطه عطف مهمی در بینایی کامپیوتر بود و نشان داد معماری Transformer میتواند در پردازش تصویر هم عملکرد بسیار قدرتمندی داشته باشد. با این حال، معماری اولیه ViT برای بسیاری از کاربردهای عملی Computer Vision محدودیتهایی داشت که استفاده از آن را در taskهای سنگین دشوار میکرد.
مهمترین چالش Vision Transformer، استفاده از Global Self-Attention روی کل تصویر بود. در این معماری، هر patch باید با تمام patchهای دیگر ارتباط برقرار کند؛ در نتیجه با افزایش اندازه تصویر، تعداد محاسبات attention بهشدت بیشتر میشود و هزینه پردازشی مدل رشد زیادی پیدا میکند.
این موضوع فقط به سرعت مدل محدود نمیشد. افزایش تعداد patchها باعث میشد مصرف حافظه نیز بالا برود و اجرای مدل روی تصاویر با رزولوشن زیاد دشوارتر شود. این مسئله مخصوصا در taskهایی مثل تشخیص اشیا و سگمنتیشن اهمیت بیشتری داشت؛ زیرا این taskها معمولا به feature mapهای بزرگتر و جزئیات فضایی بیشتری نیاز دارند.
از طرف دیگر، Vision Transformer برخلاف CNNها ساختار سلسلهمراتبی مشخصی نداشت. در CNNها، با عمیقتر شدن شبکه رزولوشن feature map کاهش پیدا میکند و مدل بهتدریج ویژگیهای پیچیدهتر را استخراج میکند. اما در معماری اولیه ViT تقریبا تمام لایهها با resolution ثابتی کار میکردند و همین موضوع استفاده از آن را برای Dense Prediction Tasks محدود میکرد.
این محدودیتها باعث شد پژوهشگران به دنبال معماریهایی باشند که بتوانند مزایای Transformerها را حفظ کنند اما همزمان هزینه محاسباتی، مصرف حافظه و مشکلات ساختاری ViT را کاهش دهند.
معماری Swin Transformer

معماری Swin Transformer بهگونهای طراحی شده که هم مزایای ترنسفورمرها را حفظ کند و هم ساختاری شبیه شبکههای CNN داشته باشد.
در معماری Swin Transformer، تصویر ورودی ابتدا به patchهای کوچک تقسیم میشود و سپس این patchها وارد چند مرحله پردازشی متوالی میشوند. هر stage شامل چند Swin Transformer Block است که attention را داخل windowهای محلی محاسبه میکنند. بین stageها نیز عملیات Patch Merging انجام میشود تا ابعاد feature map کاهش پیدا کند و مدل بتواند اطلاعات سطح بالاتری را یاد بگیرد.
بهصورت کلی، معماری Swin Transformer از این بخشها تشکیل شده است:
Input Image
↓
Patch Partition
↓
Linear Embedding
↓
Stage 1
↓
Patch Merging
↓
Stage 2
↓
Patch Merging
↓
Stage 3
↓
Patch Merging
↓
Stage 4
↓
Classification / Detection / Segmentation Head
۱. Patch Partition
اولین مرحله در Swin Transformer تقسیم تصویر به patchهای کوچک است. در نسخه استاندارد این معماری، تصویر به patchهای 4×4 تقسیم میشود. هر patch در واقع مشابه یک token در Transformerهای متنی عمل میکند.
برای مثال اگر تصویر ورودی اندازه 224×224 داشته باشد، پس از تقسیمبندی به patchهای 4×4 تعداد 56×56 patch تولید میشود. این مرحله در عمل مشابه convolution اولیه در CNNها عمل میکند و داده خام تصویر را به واحدهای قابل پردازش برای Transformer تبدیل میکند.
۲. Linear Embedding
بعد از ساخت patchها، هر patch به یک بردار ویژگی تبدیل میشود. این کار با استفاده از یک لایه Linear انجام میشود تا مدل بتواند patchها را بهصورت embedding پردازش کند.
در این مرحله، داده تصویری از فضای پیکسلی وارد فضای feature representation میشود و آماده پردازش توسط attention blocks خواهد شد.
۳. Stageهای معماری Swin Transformer
هسته اصلی Swin Transformer از چهار stage مختلف تشکیل شده است. هر stage شامل چند Swin Transformer Block است که روی feature map ورودی اعمال میشوند.
ویژگی مهم این stageها این است که:
- با عمیقتر شدن شبکه، resolution کاهش پیدا میکند
- تعداد channelها افزایش مییابد
- receptive field مدل بزرگتر میشود
این طراحی بسیار شبیه معماریهای CNN مثل ResNet است و یکی از مهمترین تفاوتهای Swin Transformer با Vision Transformer محسوب میشود.
ساختار کلی stageها به این شکل است:
| Stage | Resolution | Channel Dimension |
| Stage 1 | 56×56 | 96 |
| Stage 2 | 28×28 | 192 |
| Stage 3 | 14×14 | 384 |
| Stage 4 | 7×7 | 768 |
در هر stage چندین Swin Block پشت سر هم قرار میگیرند که attention را داخل windowهای محلی محاسبه میکنند.
۴. Patch Merging
بین stageهای مختلف، عملیاتی به نام Patch Merging انجام میشود. این بخش نقش downsampling را در معماری ایفا میکند.
در Patch Merging:
- patchهای مجاور با هم ترکیب میشوند
- resolution feature map کاهش پیدا میکند
- تعداد channelها افزایش مییابد
این فرایند دقیقا مشابه کاری است که pooling یا strided convolution در CNNها انجام میدهند.
نمونه سادهای از Patch Merging در PyTorch:
|
1 2 3 4 5 6 |
x0 = x[:, 0::2, 0::2, :] x1 = x[:, 1::2, 0::2, :] x2 = x[:, 0::2, 1::2, :] x3 = x[:, 1::2, 1::2, :] x = torch.cat([x0, x1, x2, x3], –1) |
در این کد، چهار patch مجاور با هم ترکیب میشوند تا feature representation جدید ساخته شود.
۵. Swin Transformer Blocks
هر stage از چند Swin Transformer Block تشکیل شده است. این blockها مهمترین بخش معماری هستند و attention را داخل windowهای محلی محاسبه میکنند.
هر block معمولا شامل این اجزا است:
- Window-based Self Attention
- Shifted Window Attention
- Layer Normalization
- MLP
- Residual Connection
ویژگی مهم این blockها استفاده از Shifted Window است که اجازه میدهد ارتباط بین windowهای مختلف حفظ شود و مدل فقط به اطلاعات محلی محدود نشود.
در بخشهای بعدی مقاله، ساختار Swin Block و مکانیزم Shifted Window را بهصورت کامل بررسی و با PyTorch پیادهسازی خواهیم کرد.
Patch Partition چگونه کار میکند؟
اولین مرحله در معماری Swin Transformer تبدیل تصویر به مجموعهای از patchها است. در این مرحله، تصویر ورودی به ناحیههای کوچک و ثابت تقسیم میشود تا مدل بتواند بهجای پردازش مستقیم پیکسلها، روی واحدهای ساختاریافتهتری کار کند. هر patch در واقع مشابه یک token در Transformerهای متنی عمل میکند.
در نسخه استاندارد Swin Transformer، تصویر به patchهای 4×4 تقسیم میشود. یعنی هر patch شامل ۱۶ پیکسل از تصویر اصلی است. اگر تصویر ورودی اندازه 224×224 داشته باشد، پس از تقسیمبندی به patchهای 4×4 تعداد 56×56 patch تولید میشود.
224 × 224 image
↓
4 × 4 patches
↓
56 × 56 tokens
دلیل استفاده از patch این است که Transformerها بهصورت مستقیم روی sequence کار میکنند، نه روی داده دوبعدی تصویری. بنابراین تصویر باید ابتدا به مجموعهای از tokenها تبدیل شود تا مدل بتواند مکانیزم attention را روی آن اعمال کند.
پیادهسازی Patch Partition در PyTorch
نمونه سادهای از Patch Partition را میتوان به این شکل پیادهسازی کرد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import torch def patch_partition(x, patch_size): “”“ x: [B, H, W, C] ““” B, H, W, C = x.shape x = x.view( B, H // patch_size, patch_size, W // patch_size, patch_size, C ) patches = x.permute( 0, 1, 3, 2, 4, 5 ).contiguous() patches = patches.view( –1, patch_size, patch_size, C ) return patches |
این کد دقیقا چه کاری انجام میدهد؟
در ابتدا تصویر ورودی که shape آن بهصورت [B, H, W, C] است، به بلوکهای کوچکتر تقسیم میشود. در اینجا:
- B تعداد batch
- H ارتفاع تصویر
- W عرض تصویر
- C تعداد channelها است.
سپس با استفاده از view تصویر به بخشهای 4×4 شکسته میشود. بعد از آن، permute ترتیب ابعاد را تغییر میدهد تا patchها بهصورت مستقل کنار هم قرار بگیرند.
در نهایت خروجی به مجموعهای از patchها تبدیل میشود که هرکدام shape زیر را دارند:
[patch_size, patch_size, C]
این patchها در مراحل بعدی به embedding تبدیل میشوند و بهعنوان token وارد Swin Transformer خواهند شد.
تفاوت Patch Partition با CNN
در CNNها معمولا ویژگیها با استفاده از convolution استخراج میشوند، اما در Swin Transformer تصویر ابتدا به patchهای ثابت تقسیم میشود و سپس attention روی این patchها اعمال میشود.
به همین دلیل:
- patchها نقش token را دارند
- attention جای convolution را میگیرد
- مدل میتواند ارتباط بین بخشهای مختلف تصویر را بهتر یاد بگیرد
البته Swin Transformer برخلاف Vision Transformer صرف، بعدا با استفاده از Patch Merging دوباره ساختاری سلسلهمراتبی شبیه CNNها ایجاد میکند که در بخشهای بعدی بررسی خواهیم کرد.
پیادهسازی Patch Merging در PyTorch
نمونهای از پیادهسازی Patch Merging به این شکل است:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import torch import torch.nn as nn class PatchMerging(nn.Module): def __init__(self, dim): super().__init__() self.reduction = nn.Linear( 4 * dim, 2 * dim, bias=False ) self.norm = nn.LayerNorm(4 * dim) def forward(self, x): B, H, W, C = x.shape x0 = x[:, 0::2, 0::2, :] x1 = x[:, 1::2, 0::2, :] x2 = x[:, 0::2, 1::2, :] x3 = x[:, 1::2, 1::2, :] x = torch.cat([x0, x1, x2, x3], –1) x = self.norm(x) x = self.reduction(x) return x |
این کد دقیقا چه کاری انجام میدهد؟
در این پیادهسازی، feature map ورودی به چهار بخش مجاور تقسیم میشود:
|
1 2 3 4 |
x0 = x[:, 0::2, 0::2, :] x1 = x[:, 1::2, 0::2, :] x2 = x[:, 0::2, 1::2, :] x3 = x[:, 1::2, 1::2, :] |
هرکدام از این tensorها بخشی از patchهای مجاور را نگه میدارند. سپس این چهار بخش با استفاده از torch.cat کنار هم قرار میگیرند:
|
1 |
x = torch.cat([x0, x1, x2, x3], –1) |
در نتیجه:
- ابعاد فضایی feature map نصف میشود
- اما تعداد channelها چهار برابر میشود
بعد از آن، LayerNorm روی داده اعمال میشود و در نهایت یک لایه Linear تعداد channelها را کاهش میدهد تا representation نهایی ساخته شود.
چرا Patch Merging مهم است؟
اگر Swin Transformer فقط از Window Attention استفاده میکرد اما resolution تصویر در تمام لایهها ثابت باقی میماند، مدل نمیتوانست ساختاری مشابه CNNها ایجاد کند. Patch Merging دقیقا همان بخشی است که این معماری را به یک Transformer سلسلهمراتبی تبدیل میکند.
به کمک Patch Merging:
- receptive field مدل در لایههای عمیقتر بزرگتر میشود
- featureهای پیچیدهتر استخراج میشوند
- هزینه محاسباتی کنترل میشود
- مدل برای Dense Prediction Tasks مناسبتر میشود
به همین دلیل Patch Merging یکی از مهمترین اجزای معماری Swin Transformer محسوب میشود و نقش مهمی در موفقیت آن در taskهایی مثل Object Detection و Semantic Segmentation دارد.
Window-based Self Attention چیست؟

مهمترین ایده در معماری Swin Transformer استفاده از مکانیزمی به نام Window-based Self Attention است. این روش دقیقا برای حل یکی از بزرگترین مشکلات Vision Transformer طراحی شد: هزینه محاسباتی بسیار بالای Global Attention.
در معماری اولیه ViT، مکانیزم Self-Attention روی تمام patchهای تصویر محاسبه میشود. یعنی هر patch باید با تمام patchهای دیگر ارتباط برقرار کند. این موضوع باعث میشود تعداد محاسبات attention با افزایش تعداد patchها بهصورت مربعی رشد کند.
به همین دلیل در تصاویر با رزولوشن بالا:
- مصرف حافظه شدیدا افزایش پیدا میکند
- سرعت مدل کاهش پیدا میکند
- اجرای مدل روی taskهای سنگین دشوار میشود
پیچیدگی محاسباتی Global Self-Attention به این صورت است:
\( \Omega \left ( MSA \right )= 4hwC^{2}+2\left ( hw \right )^{2}C\)
در این فرمول:
- h و w ابعاد feature map
- C تعداد channelها هستند.
بخش اصلی مشکل اینجاست:
\( \left ( hw \right )^{2}\)
چون تعداد محاسبات attention نسبت به تعداد patchها بهصورت مربعی رشد میکند.
ایده Window-based Attention
برای حل این مشکل، Swin Transformer attention را فقط داخل ناحیههای کوچک تصویر محاسبه میکند. این ناحیهها Window نام دارند.
یعنی بهجای اینکه هر patch با کل تصویر ارتباط داشته باشد، فقط با patchهای داخل همان window تعامل میکند.
برای مثال اگر:
- اندازه window برابر 7×7 باشد
attention فقط بین همان 49 patch محاسبه میشود.
Whole Image Attention ❌
[ تمام patchها با هم ]
Window Attention ✅
[ 7×7 ] [ 7×7 ]
[ 7×7 ] [ 7×7 ]
این طراحی باعث میشود تعداد محاسبات به شکل چشمگیری کاهش پیدا کند.
پیچیدگی Window-based Self Attention
در Swin Transformer، پیچیدگی attention به این صورت تغییر میکند:
\( \Omega \left ( W-MSA \right )= 4hwC^{2}+2M^{2}hwC\)
در اینجا:
- M اندازه window است
- attention فقط داخل windowها محاسبه میشود
نکته مهم این است که:
- M مقدار ثابتی دارد
- اما در Global Attention تعداد patchها دائما افزایش پیدا میکرد
به همین دلیل complexity در Swin Transformer تقریبا بهصورت خطی نسبت به اندازه تصویر رشد میکند، نه مربعی.
چرا این ایده مهم بود؟
Window-based Self Attention یکی از مهمترین دلایل موفقیت Swin Transformer محسوب میشود؛ چون این معماری توانست مزایای attention را حفظ کند اما همزمان هزینه محاسباتی را کنترل کند.
به کمک این روش:
- مدل روی تصاویر بزرگتر قابل اجرا شد
- مصرف حافظه کاهش پیدا کرد
- سرعت آموزش و inference بهتر شد
- استفاده از Transformerها در taskهای عملی Computer Vision ممکنتر شد
البته Window Attention یک محدودیت مهم هم داشت: هر window فقط اطلاعات همان ناحیه را میدید و ارتباط مستقیمی بین windowهای مختلف وجود نداشت. Swin Transformer این مشکل را با مکانیزمی به نام Shifted Window حل میکند که در بخش بعدی مقاله بررسی خواهیم کرد.
Shifted Window Attention چگونه کار میکند؟
اگرچه Window-based Self Attention توانست هزینه محاسباتی Transformerها را به شکل قابل توجهی کاهش دهد، اما یک مشکل مهم ایجاد کرد: هر window فقط اطلاعات همان ناحیه محدود را میدید و ارتباط مستقیمی بین windowهای مختلف وجود نداشت. در نتیجه مدل نمیتوانست وابستگیهای بین بخشهای مختلف تصویر را بهخوبی یاد بگیرد.
به این مشکل، isolated windows گفته میشود.
برای مثال، فرض کنید تصویر به چند window جداگانه تقسیم شده باشد:
[ Window 1 ] [ Window 2 ]
[ Window 3 ] [ Window 4 ]
در این حالت:
- patchهای داخل هر window با هم ارتباط دارند
- اما patchهای دو window مجاور هیچ تعاملی ندارند
این موضوع باعث میشود اطلاعات فضایی تصویر بین windowها قطع شود و مدل فقط روی ویژگیهای محلی تمرکز کند.
ایده Shifted Window
Swin Transformer این مشکل را با یک ایده ساده اما بسیار هوشمندانه حل میکند: جابهجا کردن windowها بین دو لایه متوالی. در Swin Transformer:
- یک block از Window Attention معمولی استفاده میکند
- block بعدی windowها را جابهجا میکند
به همین دلیل patchهایی که قبلا داخل windowهای جدا قرار داشتند، در لایه بعدی وارد یک window مشترک میشوند و میتوانند با هم ارتباط برقرار کنند.
Layer 1
[ 7×7 ][ 7×7 ]
Layer 2 (Shifted)
[ 7×7 ][ 7×7 ]
این جابهجایی باعث میشود ارتباط بین windowهای مختلف حفظ شود، بدون اینکه مدل مجبور باشد attention را روی کل تصویر محاسبه کند.
Cyclic Shift چیست؟
برای پیادهسازی Shifted Window، Swin Transformer feature map را به اندازه مشخصی جابهجا میکند. این فرایند با استفاده از عملیاتی به نام Cyclic Shift انجام میشود. در Cyclic Shift:
- feature map به سمت بالا و چپ shift میشود
- بخشهایی که از تصویر خارج میشوند دوباره از سمت مقابل وارد میشوند
در عمل، این کار شبیه یک حرکت حلقهای روی feature map است.
نمونه ساده پیادهسازی این عملیات در PyTorch:
|
1 2 3 4 5 |
shifted_x = torch.roll( x, shifts=(–shift_size, –shift_size), dims=(1, 2) ) |
در این کد:
- shift_size مقدار جابهجایی windowها است
- torch.roll داده را بهصورت cyclic جابهجا میکند
Cross-Window Communication چگونه ایجاد میشود؟
مهمترین مزیت Shifted Window این است که ارتباط بین windowهای مختلف را بدون استفاده از Global Attention ممکن میکند.
در Window Attention معمولی:
Window A ↔ Window A
Window B ↔ Window B
اما بعد از Shift:
Window A ↔ بخشی از Window B
Window B ↔ بخشی از Window C
در نتیجه:
- اطلاعات بین نواحی مختلف تصویر منتقل میشود
- receptive field مدل بزرگتر میشود
- وابستگیهای فضایی بهتر یاد گرفته میشوند
و همه این اتفاقات بدون هزینه بسیار سنگین Global Self-Attention رخ میدهد.
پیادهسازی Shifted Window در PyTorch
یکی از جذابترین بخشهای Swin Transformer این است که ایده Shifted Window با وجود تاثیر بسیار زیادش، پیادهسازی نسبتا سادهای دارد. هسته اصلی این مکانیزم فقط با چند خط کد در PyTorch قابل پیادهسازی است.
همانطور که در بخش قبل دیدیم، هدف Shifted Window این است که windowها بین دو لایه متوالی جابهجا شوند تا ارتباط بین نواحی مختلف تصویر حفظ شود. برای انجام این کار، Swin Transformer ابتدا feature map را shift میکند و سپس Window Attention را روی feature map جدید اعمال میکند.
۱. استفاده از torch.roll برای Cyclic Shift
در پیادهسازی PyTorch، عملیات shift معمولا با استفاده از تابع torch.roll انجام میشود:
|
1 2 3 4 5 |
shifted_x = torch.roll( x, shifts=(–self.shift_size, –self.shift_size), dims=(1, 2) ) |
در این کد:
- x همان feature map ورودی است
- shift_size مقدار جابهجایی windowها را مشخص میکند
- dims=(1, 2) یعنی عملیات shift روی ارتفاع و عرض feature map انجام میشود
اگر مقدار shift_size برابر 3 باشد، feature map سه پیکسل به سمت بالا و چپ جابهجا میشود.
چرا از Cyclic Shift استفاده میشود؟
تابع torch.roll داده را بهصورت حلقهای جابهجا میکند. یعنی بخشهایی که از یک سمت feature map خارج میشوند، دوباره از سمت مقابل وارد میشوند.
برای مثال:
قبل از Shift
A B C D
E F G H
I J K L
M N O P
بعد از Shift:
K L I J
O P M N
C D A B
G H E F
این رفتار باعث میشود ابعاد feature map حفظ شود و مدل بتواند بدون تغییر shape داده، windowهای جدید ایجاد کند.
۲. Window Partition بعد از Shift
بعد از اینکه feature map جابهجا شد، دوباره به windowهای کوچک تقسیم میشود:
|
1 2 3 4 |
x_windows = window_partition( shifted_x, self.window_size ) |
اما تفاوت مهم اینجاست که حالا:
- patchهایی که قبلاً داخل windowهای جدا بودند
- در یک window مشترک قرار میگیرند
و همین موضوع Cross-Window Communication را ممکن میکند.
ساختار کلی Shifted Window Attention
پیادهسازی کامل Shifted Window معمولاً چنین روندی دارد:
Input Feature Map
↓
Cyclic Shift
↓
Window Partition
↓
Window Attention
↓
Reverse Shift
بعد از پایان attention، feature map دوباره به موقعیت اولیه برگردانده میشود تا ساختار فضایی تصویر حفظ شود.
۳. Reverse Shift در PyTorch
برای بازگرداندن feature map به حالت اولیه، دوباره از torch.roll استفاده میشود:
|
1 2 3 4 5 |
x = torch.roll( shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2) ) |
در این مرحله:
- feature map به جای قبلی خود بازمیگردد
- اما اطلاعات جدید بین windowها منتقل شده است
سادگی این پیادهسازی یکی از نقاط قوت Swin Transformer محسوب میشود. برخلاف بسیاری از معماریهای پیچیده attention، مکانیزم Shifted Window فقط با چند عملیات ساده tensor manipulation ساخته میشود، اما تاثیر بسیار زیادی روی عملکرد مدل دارد.
به کمک این طراحی:
- ارتباط بین windowها حفظ میشود
- complexity همچنان پایین باقی میماند
- مدل مقیاسپذیرتر میشود
- استفاده از Transformerها در تصاویر بزرگ عملیتر میشود
به همین دلیل بخش بزرگی از موفقیت Swin Transformer به همین ایده ساده اما موثر برمیگردد.
ساخت Swin Transformer Block
هسته اصلی معماری Swin Transformer از واحدهایی به نام Swin Transformer Block ساخته شده است. هر block مسئول پردازش feature map و یادگیری ارتباط بین patchها است. این blockها بهصورت متوالی در هر stage قرار میگیرند و با استفاده از Window-based Attention و Shifted Window اطلاعات تصویر را پردازش میکنند.
ساختار Swin Block شباهت زیادی به blockهای استاندارد Transformer دارد، اما بهجای Global Attention از Window-based Self Attention استفاده میکند.
نمونه سادهای از ساختار این block در PyTorch میتواند به این شکل باشد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
class SwinTransformerLayer(nn.Module): def __init__( self, dim, num_heads, window_size=7, shift_size=0, mlp_ratio=4.0 ): super().__init__() self.norm1 = nn.LayerNorm(dim) self.attn = WindowAttention( dim, window_size=window_size, num_heads=num_heads ) self.drop_path = DropPath(0.1) self.norm2 = nn.LayerNorm(dim) hidden_dim = int(dim * mlp_ratio) self.mlp = MLP( in_features=dim, hidden_features=hidden_dim ) def forward(self, x): shortcut = x x = self.norm1(x) x = self.attn(x) x = shortcut + self.drop_path(x) shortcut = x x = self.norm2(x) x = self.mlp(x) x = shortcut + self.drop_path(x) return x |
Window-based Multi-Head Self Attention (W-MSA)
مهمترین بخش این block، لایه attention است:
|
1 |
self.attn = WindowAttention(...) |
در این مرحله attention فقط داخل windowهای محلی محاسبه میشود، نه روی کل تصویر. به همین دلیل Swin Transformer میتواند هزینه محاسباتی را کنترل کند و روی تصاویر بزرگتر مقیاسپذیر باقی بماند.
در بعضی blockها نیز بهجای W-MSA معمولی، از Shifted Window Attention استفاده میشود تا ارتباط بین windowها حفظ شود.
Layer Normalization
قبل از attention و MLP از LayerNorm استفاده میشود:
|
1 2 |
self.norm1 = nn.LayerNorm(dim) self.norm2 = nn.LayerNorm(dim) |
وظیفه LayerNorm این است که distribution دادهها را پایدار نگه دارد و آموزش مدل را سادهتر کند. بدون normalization، آموزش Transformerها معمولاً ناپایدار میشود و gradientها ممکن است دچار انفجار یا ناپدید شدن شوند.
در Swin Transformer، LayerNorm قبل از attention و MLP اعمال میشود که به این ساختار Pre-Norm گفته میشود.
Residual Connection
یکی دیگر از اجزای مهم Swin Block، residual connection است:
|
1 |
x = shortcut + self.drop_path(x) |
در اینجا خروجی attention یا MLP با ورودی اصلی block جمع میشود.
Residual Connection دو مزیت مهم دارد:
- جریان gradient را در شبکههای عمیق حفظ میکند
- باعث میشود مدل راحتتر آموزش ببیند
این ایده اولینبار در ResNet بسیار موفق بود و بعدها تقریبا به بخش ثابت معماری Transformerها تبدیل شد.
MLP Block
بعد از attention، خروجی وارد یک MLP میشود:
|
1 |
self.mlp = MLP(...) |
این بخش معمولا شامل:
- دو لایه Linear
- تابع فعالسازی GELU
- Dropout است.
وظیفه MLP این است که feature representation را غنیتر کند و روابط غیرخطی پیچیدهتری را یاد بگیرد.
در بسیاری از پیادهسازیها، ابعاد hidden layer در MLP چهار برابر embedding dimension در نظر گرفته میشود:
|
1 |
hidden_dim = int(dim * 4) |
DropPath چیست؟
در Swin Transformer معمولاً از تکنیکی به نام DropPath استفاده میشود:
|
1 |
self.drop_path = DropPath(0.1) |
DropPath شبیه Dropout عمل میکند، اما بهجای حذف neuronها، بعضی مسیرهای residual را بهصورت تصادفی غیرفعال میکند.
این کار:
- overfitting را کاهش میدهد
- مدل را مقاومتر میکند
- باعث بهبود generalization میشود
استفاده از DropPath مخصوصا در مدلهای عمیق Transformer اهمیت زیادی دارد.
Swin Transformer Block در واقع جایی است که تمام ایدههای اصلی معماری کنار هم قرار میگیرند:
- Window-based Attention
- Shifted Window
- Residual Connection
- LayerNorm
- MLP
- DropPath
ترکیب این اجزا باعث میشود Swin Transformer بتواند هم دقت بالایی داشته باشد و هم از نظر محاسباتی مقیاسپذیر باقی بماند. به همین دلیل طراحی این block یکی از مهمترین دلایل موفقیت Swin Transformer در taskهای مختلف Computer Vision محسوب میشود.
تفاوت Swin Transformer و Vision Transformer

در نگاه اول، Vision Transformer و Swin Transformer هر دو از معماری Transformer برای پردازش تصویر استفاده میکنند، اما طراحی داخلی آنها تفاوتهای مهمی دارد. Swin Transformer در واقع برای حل محدودیتهای ViT ساخته شد و تلاش کرد Transformerها را به گزینهای عملیتر برای taskهای مختلف بینایی ماشین تبدیل کند.
مهمترین تفاوت این دو معماری، نحوه محاسبه attention است. در ViT، attention روی تمام patchهای تصویر محاسبه میشود؛ یعنی هر patch با تمام patchهای دیگر ارتباط دارد. این طراحی اگرچه قدرت بالایی در یادگیری روابط سراسری تصویر ایجاد میکند، اما هزینه محاسباتی بسیار زیادی دارد. در مقابل، Swin Transformer attention را فقط داخل windowهای محلی محاسبه میکند و با استفاده از Shifted Window ارتباط بین این ناحیهها را حفظ میکند.
از طرف دیگر، Vision Transformer ساختار سلسلهمراتبی مشخصی ندارد و تقریبا در تمام لایهها با resolution ثابتی کار میکند. اما Swin Transformer با استفاده از Patch Merging، ساختاری مشابه CNNها ایجاد میکند و در هر stage ابعاد feature map را کاهش میدهد. همین ویژگی باعث میشود Swin Transformer برای taskهایی مثل Object Detection و Semantic Segmentation مناسبتر باشد.
جدول زیر مهمترین تفاوتهای این دو معماری را نشان میدهد:
| ویژگی | Vision Transformer (ViT) | Swin Transformer |
| نوع Attention | Global Attention | Window-based Attention |
| پیچیدگی محاسباتی | Quadratic | تقریباً Linear |
| ساختار سلسلهمراتبی | ❌ ندارد | ✅ دارد |
| مقیاسپذیری روی تصاویر بزرگ | محدودتر | بهتر |
| مصرف حافظه | بالا | کمتر |
| مناسب برای Detection و Segmentation | ضعیفتر | قویتر |
| Backbone برای Dense Tasks | محدود | بسیار مناسب |
| نحوه پردازش Feature Map | Resolution ثابت | Multi-Stage Hierarchy |
تفاوت در Complexity
در ViT، complexity attention بهصورت مربعی رشد میکند:
\( \Omega \left ( MSA \right )= 4hwC^{2}+2\left ( hw \right )^{2}C\)
اما در Swin Transformer، چون attention فقط داخل windowها محاسبه میشود، complexity بسیار کنترلشدهتر است:
\( \Omega \left ( W-MSA \right )= 4hwC^{2}+2M^{2}hwC\)
همین تفاوت یکی از مهمترین دلایل مقیاسپذیری بهتر Swin Transformer محسوب میشود.
چرا Swin Transformer برای Detection قویتر است؟
Taskهایی مثل:
- Object Detection
- Instance Segmentation
- Semantic Segmentation
نیاز دارند مدل اطلاعات فضایی تصویر را در چندین سطح مختلف حفظ کند. معماری ViT به دلیل نداشتن feature hierarchy برای این taskها محدودتر بود.
اما Swin Transformer با استفاده از:
- Patch Merging
- Multi-Stage Architecture
- Shifted Window
توانست ساختاری شبیه CNNها ایجاد کند و به backbone بسیار قدرتمندی برای Dense Prediction Tasks تبدیل شود.
به همین دلیل بسیاری از frameworkهای مدرن بینایی ماشین از Swin Transformer بهعنوان backbone استفاده میکنند.
مدلهای مختلف Swin Transformer

Swin Transformer در چند نسخه مختلف منتشر شد تا بتواند در سناریوهای متفاوت، از مدلهای سبک برای inference سریع گرفته تا مدلهای بسیار بزرگ برای taskهای سنگین، استفاده شود. این نسخهها از نظر:
- تعداد پارامترها
- تعداد لایهها
- ابعاد embedding
- میزان FLOPs
- و دقت نهایی
با هم تفاوت دارند.
چهار نسخه اصلی این معماری عبارتاند از:
- Swin-T (Tiny)
- Swin-S (Small)
- Swin-B (Base)
- Swin-L (Large)
هرچه مدل بزرگتر میشود:
- تعداد پارامترها افزایش پیدا میکند
- هزینه محاسباتی بیشتر میشود
- اما معمولا دقت مدل نیز بالاتر میرود
۱. Swin-T (Tiny)
مدل Swin-T سبکترین نسخه خانواده Swin Transformer است و بیشتر برای:
- inference سریع
- منابع سختافزاری محدود
- edge deployment
- experimentation استفاده میشود.
ویژگیها:
- حدود 28 میلیون پارامتر
- FLOPs پایینتر
- سرعت بالا
- مناسب برای آموزش و تست اولیه
این مدل معمولا نقطه شروع خوبی برای توسعهدهندهها محسوب میشود.
۲. Swin-S (Small)
نسخه Small تعادل بهتری بین دقت و هزینه محاسباتی ایجاد میکند. این مدل نسبت به Swin-T:
- عمق بیشتری دارد
- feature representation قویتری میسازد
- اما هنوز نسبتا سبک محسوب میشود
در بسیاری از پروژههای عملی، Swin-S انتخاب متعادلی بین performance و efficiency است.
۳. Swin-B (Base)
Swin-B نسخه قدرتمندتر این خانواده است و معمولا در benchmarkهای حرفهایتر استفاده میشود. این مدل:
- تعداد channel بیشتری دارد
- attention قویتری تولید میکند
- و در taskهایی مثل Detection و Segmentation عملکرد بسیار خوبی ارائه میدهد
البته هزینه محاسباتی و مصرف حافظه آن نیز بهمراتب بیشتر است.
۴. Swin-L (Large)
Swin-L بزرگترین نسخه اصلی این معماری است و بیشتر برای:
- training در مقیاس بزرگ
- دیتاستهای عظیم
- research
- و benchmarkهای state-of-the-art استفاده میشود.
این مدل:
- پارامترهای بسیار بیشتری دارد
- حافظه زیادی مصرف میکند
- اما بالاترین دقت را در بسیاری از benchmarkها ارائه میدهد.
مقایسه مدلهای مختلف Swin Transformer
جدول زیر تفاوت نسخههای اصلی Swin را نشان میدهد:
| مدل | تعداد پارامتر | FLOPs | مناسب برای |
|---|---|---|---|
| Swin-T (Tiny) | حدود 28 میلیون | 4.5G | مدلهای سبک و سریع |
| Swin-S (Small) | حدود 50 میلیون | 8.7G | تعادل بین دقت و سرعت |
| Swin-B (Base) | حدود 88 میلیون | 15.4G | کاربردهای حرفهای و صنعتی |
| Swin-L (Large) | حدود 197 میلیون | 34.5G | مدلهای بزرگ، پژوهشی و پردازشهای سنگین |
FLOPs چیست و چرا مهم است؟
FLOPs مخفف Floating Point Operations است و تعداد عملیات محاسباتی مدل را نشان میدهد. هرچه FLOPs بیشتر باشد:
- مدل سنگینتر است
- inference کندتر میشود
- GPU بیشتری نیاز دارد
اما معمولا دقت مدل نیز افزایش پیدا میکند. به همین دلیل انتخاب نسخه مناسب Swin Transformer کاملا به کاربرد پروژه بستگی دارد. برای مثال:
- اگر سرعت inference مهم باشد ← Swin-T
- اگر دقت اهمیت بیشتری داشته باشد ← Swin-B یا Swin-L
انتخابهای منطقیتری هستند.
کدام نسخه Swin Transformer بهتر است؟
پاسخ این سؤال کاملا به نیاز پروژه بستگی دارد. در بسیاری از پروژههای واقعی، Swin-S و Swin-B محبوبترین انتخابها هستند؛ چون تعادل خوبی بین:
- performance
- memory usage
- و inference speed ایجاد میکنند.
اما برای یادگیری معماری یا اجرای مدل روی سیستمهای ضعیفتر، معمولا Swin-T انتخاب مناسبتری است.
محدودیتهای Swin Transformer

با وجود موفقیت بسیار زیاد Swin Transformer، این معماری همچنان محدودیتهایی دارد و در همه سناریوها بهترین انتخاب ممکن نیست. Swin Transformer توانست بسیاری از مشکلات Vision Transformer را کاهش دهد، اما استفاده از Transformerها در پردازش تصویر هنوز هم هزینهها و پیچیدگیهای خاص خود را دارد.
۱. هزینه بالای Training
یکی از مهمترین محدودیتهای Swin Transformer، هزینه بالای آموزش مدل است. اگرچه Window-based Attention complexity را نسبت به Vision Transformer کاهش میدهد، اما آموزش مدلهای بزرگ Swin همچنان به:
- GPUهای قدرتمند
- حافظه زیاد
- و زمان آموزش طولانی نیاز دارد.
این موضوع مخصوصا در نسخههای بزرگتر مثل Swin-B و Swin-L بیشتر دیده میشود. در بسیاری از پروژههای صنعتی، training کامل این مدلها بدون زیرساخت سختافزاری مناسب عملا دشوار است.
۲. مصرف حافظه
Swin Transformer نسبت به ViT بهینهتر است، اما همچنان در مقایسه با بسیاری از CNNها مصرف حافظه بالاتری دارد. دلیل اصلی این موضوع:
- محاسبات attention
- نگهداری feature mapها
- و تعداد زیاد پارامترها است.
این مسئله در taskهایی مثل Detection، Segmentation و Video Understanding که ورودیهای بزرگتری دارند، بیشتر خودش را نشان میدهد. به همین دلیل اجرای نسخههای سنگین Swin Transformer روی GPUهای محدود ممکن است چالشبرانگیز باشد.
۳. پیچیدگی پیادهسازی
برخلاف CNNهای سنتی، پیادهسازی Swin Transformer پیچیدگی بیشتری دارد. بخشهایی مثل:
- Window Partition
- Shifted Window
- Attention Masking
- Patch Merging
نیازمند عملیات دقیق tensor manipulation هستند. برای مثال، فقط مدیریت shift و بازگرداندن feature mapها میتواند پیادهسازی را پیچیدهتر کند:
|
1 2 3 4 5 |
shifted_x = torch.roll( x, shifts=(–shift_size, –shift_size), dims=(1, 2) ) |
به همین دلیل توسعه و دیباگ مدلهای مبتنی بر Swin معمولا سختتر از معماریهای CNN کلاسیک است.
۴. وابستگی بیشتر به داده
Transformerها معمولا نسبت به CNNها وابستگی بیشتری به داده دارند و Swin Transformer نیز تا حدی همین ویژگی را حفظ کرده است. اگر حجم داده آموزشی کم باشد:
- احتمال overfitting افزایش پیدا میکند
- مدل ممکن است generalization ضعیفتری داشته باشد
به همین دلیل بسیاری از مدلهای Swin روی دیتاستهای بزرگ مثل ImageNet-22K pretrain میشوند.
۵. سرعت Inference در مدلهای بزرگ
اگرچه Swin Transformer نسبت به ViT کارآمدتر است، اما نسخههای بزرگتر آن همچنان inference سنگینی دارند. در کاربردهای real-time یا edge deployment، استفاده از مدلهایی مثل Swin-L همیشه عملی نیست.
در چنین شرایطی نسخههای Tiny یا Small یا حتی بعضی CNNهای بهینهشده ممکن است انتخاب مناسبتری باشند.
آیا این محدودیتها مشکل بزرگی هستند؟
بسیاری از این محدودیتها در اکثر معماریهای Transformer دیده میشوند و مختص Swin Transformer نیستند. با این حال، Swin توانسته تعادل بسیار بهتری بین دقت، complexity و مقیاسپذیری ایجاد کند.
به همین دلیل هنوز هم یکی از مهمترین backboneهای مبتنی بر Transformer در Computer Vision محسوب میشود و در بسیاری از مدلهای مدرن استفاده میشود.
آیا Swin Transformer جای CNN را میگیرد؟
موفقیت Swin Transformer باعث شد بسیاری تصور کنند Transformerها قرار است بهطور کامل جای CNNها را بگیرند. Swin Transformer واقعا توانست محدودیتهای Vision Transformer را کاهش دهد و در taskهایی مثل Detection و Segmentation عملکرد بسیار قدرتمندی ارائه کند. استفاده از Window Attention، ساختار Hierarchical و Shifted Window باعث شد این معماری هم مقیاسپذیرتر شود و هم برای پردازش تصویر عملیتر عمل کند.
با این حال، CNNها هنوز مزایای مهمی دارند. مدلهای مبتنی بر convolution معمولا سبکتر هستند، حافظه کمتری مصرف میکنند و روی دستگاههای ضعیفتر یا پروژههای real-time عملکرد بهتری دارند. به همین دلیل معماریهایی مثل ResNet و EfficientNet همچنان در بسیاری از پروژههای صنعتی استفاده میشوند.
در مقابل، Transformerها مخصوصا در مدلهای بزرگ، multimodal systems و taskهای پیچیدهتر عملکرد بهتری نشان میدهند؛ چون attention میتواند وابستگیهای سراسری تصویر را بهتر یاد بگیرد. به همین دلیل امروز بسیاری از مدلهای مدرن بینایی ماشین به سمت استفاده از attention یا معماریهای hybrid حرکت کردهاند.
در نتیجه، دیدگاه غالب در جامعه Deep Learning این نیست که Transformerها کاملا جای CNNها را میگیرند؛ بلکه آینده Computer Vision احتمالا ترکیبی از بهترین ایدههای هر دو معماری خواهد بود.
جمعبندی
Swin Transformer یکی از مهمترین معماریهای مدرن بینایی ماشین است که با ترکیب ایدههای Transformer و ساختار سلسلهمراتبی CNNها توانست بسیاری از محدودیتهای Vision Transformer را حل کند. استفاده از Window-based Attention، Shifted Window و Patch Merging باعث شد این مدل هم مقیاسپذیرتر باشد و هم در taskهایی مثل Detection و Segmentation عملکرد بسیار قدرتمندی ارائه دهد. با وجود چالشهایی مثل هزینه بالای training و پیچیدگی پیادهسازی، Swin Transformer همچنان یکی از تأثیرگذارترین معماریهای Transformer-based در Computer Vision محسوب میشود و بسیاری از مدلهای جدید از ایدههای آن الهام گرفتهاند.
منبع
سوالات متداول
ViT کل تصویر را بهصورت یکجا پردازش میکند، اما Swin Transformer از پنجرههای محلی (Shifted Windows) استفاده میکند تا مصرف حافظه و هزینه محاسباتی کاهش پیدا کند.
در هر لایه، پنجرههای Attention جابهجا میشوند تا مدل بتواند ارتباط بین بخشهای مختلف تصویر را بهتر یاد بگیرد.
نه کاملاً. Swin Transformer در بسیاری از benchmarkها عملکرد بهتری دارد، اما CNNها هنوز برای پروژههای سبک و real-time بسیار محبوب هستند.
CNNها ویژگیهای محلی را با فیلترهای ثابت استخراج میکنند، اما Swin Transformer با مکانیزم Attention وابستگیهای پیچیدهتری را یاد میگیرد.
بله. نسخههایی از Swin Transformer برای Video Understanding و Action Recognition توسعه داده شدهاند.


دیدگاهتان را بنویسید