【深度學習】深刻理解Swin Transformer

Swin Transformer 是一種基于 Transformer 的視覺模型,由 Microsoft 研究團隊提出,旨在解決傳統 Transformer 模型在計算機視覺任務中的高計算復雜度問題。其全稱是 Shifted Window Transformer,通過引入分層架構和滑動窗口機制,Swin Transformer 在性能和效率之間取得了平衡,廣泛應用于圖像分類、目標檢測、分割等視覺任務,稱為新一代的backbone,可直接套用在各項下游任務中。在Swin Transformer中,提供大、中、小不同版本模型,可以進行自由選擇合適的使用。

論文原文:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

1.??介紹

????????Transformer 最初在自然語言處理(NLP)領域大獲成功,但直接將 Transformer 應用于計算機視覺任務存在很多挑戰。傳統Transformer中,拿到了圖像數據,將圖片進行劃分成一個個patch,盡可能patch細一些。但是圖像中像素點太多了,如果需要更多的特征,就必須構建很長的序列。而越長的序列算起注意力肯定越慢,自注意力機制的計算復雜度是O(n^2),當處理高分辨率圖像時,這種復雜度會快速增長,這就導致了效率問題。

????????而且圖像中許多視覺信息依賴于局部關系,而標準 Transformer 處理的是全局關系,可能無法有效捕獲局部特征。Swin Transformer便采用窗口和分層的形式來替代長序列的方法,CNN中經常提到感受野,在Transformer中對應的就是分層。也就是說,我們可以將當前這件事做L次(Lx),每次都會兩兩進行合并,向量數越來越小(400個token-200個token-100個token),窗口的大小也會增大。分層操作也就是,第一層的時候token很多,第二層合并token,第三層合并token,就像我們的卷積和池化的操作。而在傳統的Transformer中,第一層怎么做,第二層第三層也會采用同樣的尺寸進行,都是一樣的操作。

2. Swin Transformer 整體架構

2.1. Patch Embedding

????????在 Swin Transformer 中,Patch Embedding 負責將輸入圖像分割成多個小塊(patches),并將這些小塊的像素值嵌入到一個高維空間中,形成適合 Transformer 處理的特征表示。在傳統的卷積神經網絡(CNN)中,卷積操作可以用來提取局部特征。在 Swin Transformer 中,為了將輸入圖像轉化為適合 Transformer 模型處理的 patch 序列,首先對輸入圖像進行分塊。假設輸入圖像的大小為 224x224x3,其通過一個卷積操作實現。卷積操作可以將每個局部區域的像素值映射為一個更高維的特征向量。假設輸入圖像大小為 224x224x3,應用一個卷積層,參數為 Conv2d(3, 96, kernel_size=(4, 4), stride=(4, 4)),這表示卷積核的大小是 4x4,步長是 4,輸入的通道數是 3(RGB圖像),輸出的通道數是 96。卷積后,圖像的空間維度會變小,輸出的特征圖的尺寸會變為 56x56(通過計算:(224 - 4) / 4 + 1 = 56)。所以,卷積后的輸出大小是 56x56x96,這表示每個空間位置(56x56)都有一個96維的特征向量。

????????在 Swin Transformer 中,通常將圖像通過卷積操作分割成不重疊的小塊(patches)。每個小塊對應一個特征向量。例如,56x56x96 的輸出可以視為有 3136 個 patch,每個 patch 是一個 96 維的向量。這些特征向量將作為 Transformer 模型的輸入序列。根據不同的卷積參數(如 kernel_size 和 stride),你可以控制生成的 patch 的數量和每個 patch 的維度。例如,如果使用更小的卷積核和步長,可以得到更細粒度的 patch,反之則可以得到較大的 patch。

  • kernel_size 決定了每個 patch 的空間大小。
  • stride 決定了每個 patch 之間的間隔,即步長。

2.2. window_partition

????????在 Swin Transformer 中,圖像的特征表示不僅僅是通過 Patch Embedding 來獲得,還通過 窗口劃分(Window Partition) 來進一步細化和處理,通過窗口內的局部注意力機制來增強計算效率并捕捉局部特征。

????????假設輸入的圖像經過卷積處理后得到了大小為 56x56x96 的特征圖,將這個特征圖劃分為多個小窗口(window),每個窗口包含一部分局部信息,其中窗口大小為7x7,特征圖大小為56x56。為了將特征圖劃分成大小為 7x7 的窗口,我們首先計算在空間維度(高和寬)上可以分成多少個窗口,水平和垂直方向上,每個 7x7 窗口可以覆蓋 56 / 7 = 8 個窗口(總共 8x8 = 64 個窗口),窗口內部的特征圖由 96 個通道組成。因此,在劃分后,特征圖的維度將變為 (64, 7, 7, 96),其中:

  • 64 表示窗口的數量(即 8x8 = 64 個窗口)。
  • 7x7 是每個窗口的空間維度。
  • 96 是每個窗口內的特征通道數。

????????在 Swin Transformer 中,Token 通常指的是圖像中的局部特征,每個 Token 是圖像的一個小區域。在 Window Partition 過程中,我們將整個圖像的 Token 重新組織成窗口(Window)。之前每個 Token 對應一個圖像位置,現在每個 Token 對應一個窗口的內部特征。所以,原來每個 Token(如卷積后的每個空間位置)代表了圖像的一部分信息,現在我們通過窗口劃分來捕捉更大范圍的局部信息。這種劃分有助于模型專注于圖像的局部結構,同時減少計算量,因為每個窗口只在局部范圍內進行注意力計算。

2.3. W-MSA(Windwow multi-head self attention)

????????在 Swin Transformer 中,W-MSA (Window Multi-Head Self Attention) 是關鍵的注意力機制,它通過在每個窗口內部獨立地計算自注意力(Self-Attention)來減少計算復雜度,并捕捉局部特征。

????????通過 Window Partition 將特征圖劃分為 64 個窗口,每個窗口的尺寸為 7x7,并且每個位置的特征通道數為 96,因此每個窗口的形狀為 (7, 7, 96),這些窗口將作為 W-MSA 的輸入。在 Multi-Head Self-Attention 中,首先需要將輸入特征矩陣(窗口內的特征)通過三個不同的矩陣進行線性變換,得到 查詢(Q)鍵(K)值(V),這三個矩陣用于計算注意力得分。對于每個頭(Head),計算過程是獨立的。假設有 3 個頭,那么每個頭的輸入特征維度為 96 / 3 = 32,因為 96 維的輸入被平均分成了 3 個頭,每個頭負責 32 維的特征。在 W-MSA 中,針對每個窗口獨立計算自注意力得分,計算方法如下:

  • 對每個窗口中的 49 個像素點(即每個位置的特征向量)進行查詢Q、鍵K、值V的計算。

  • 自注意力得分(Attention Score) 是通過計算查詢與鍵的點積(或者其他相似度度量)得到的,這可以表示為:

    \text{Attention Score} = \frac{Q \cdot K^T}{\sqrt{d_k}}

    其中,d_k 是每個頭的維度(在這里是 32),Q 和 K 的乘積衡量了每個位置之間的相似性。

  • Softmax:通過 Softmax 操作將得分歸一化,使其成為概率分布,得到每個位置與其他位置的相關性。

  • 加權值(Weighted Sum):使用得分對值V進行加權求和,得到每個位置的最終輸出表示。

????????每個頭的自注意力計算都會產生一個形狀為 (64, 3, 49, 49) 的結果,其中,64 表示窗口的數量,3 表示頭的數量,49 是每個窗口中位置的數量(7x7),49 代表每個位置對其他位置的注意力得分(自注意力矩陣)。因此,每個頭會計算出每個窗口內所有位置之間的自注意力得分,輸出的形狀為 (64, 3, 49, 49)

2.4. window_reverse

? ?Window Reverse 操作的目的是將計算得到的 (64, 49, 96) 特征圖恢復回原始的空間維度 (56, 56, 96)。為此,我們需要將每個窗口的 49 個位置(7x7)重新排列到原始的圖像空間中。步驟:

  • Reshape 操作: 每個窗口的特征圖形狀是 (49, 96),我們將其轉換成 (7, 7, 96) 的形狀,表示每個窗口中的每個像素點都有一個 96 維的特征向量。

  • 按窗口拼接: 將所有 64 個窗口按照它們在特征圖中的位置重新排列成 56x56 的大特征圖。原始的輸入特征圖大小是 56x56,這意味著 64 個窗口將按照 8x8 的網格排列,并恢復到一個 (56, 56, 96) 的特征圖。

????????在 Window Reverse 操作后,恢復得到的特征圖形狀是 (56, 56, 96),這與卷積后的特征圖的形狀一致。56x56 是恢復后的空間維度,代表每個像素點在特征圖中的位置;96 是每個像素點的特征維度,表示每個位置的特征信息。

2.5. SW-MASA

為什么要滑動窗口(Shifted Window)?

????????原始的 Window MSA 將圖像劃分為固定的窗口(例如 7x7),并在每個窗口內計算自注意力。這樣做的一個問題是每個窗口內部的信息相對封閉,沒有與相鄰窗口之間的信息交流。因此,模型容易局限于各自的小區域,無法充分捕捉不同窗口之間的關聯。

????????通過引入 滑動窗口Shifted Window)機制,窗口在原來位置的基礎上向四個方向移動一部分,重疊區域與原窗口有交集。這樣,原本相互獨立的窗口就可以共享信息,增強了模型的表達能力和全局感知。

位移操作(Shift Operation)

????????位移操作的細節如下:

  • 初始的窗口被劃分為 4x4 的塊(例如 7x7 窗口),每個塊進行獨立的自注意力計算。
  • 在進行位移時,原來 4x4 的窗口將被平移,變成新的大小為 9x9 的窗口,窗口重疊區域包含了不同窗口之間的信息。
  • 通過平移,模型能獲取到更廣泛的信息,使得窗口之間能夠通過共享信息來融合彼此的特征,避免局部化。

????????Shifted Window MSA 會導致計算量的增加,特別是在窗口滑動后,窗口數量從 4x4 變為 9x9,計算量幾乎翻倍。為了控制計算量的增長,可以通過 mask 操作 來減少不必要的計算。在位移后,窗口之間會重疊。為了避免重復計算,我們可以使用 mask 來屏蔽掉不需要計算的部分。在計算注意力時,對于每個位置的 QK 的匹配,使用 softmax 時,設置不需要計算的位置的值為負無窮,這樣對應位置的注意力值將接近零,不會對結果產生影響。

????????在進行 SW-MSA 后,輸出的特征圖的形狀仍然是 56x56x96,與輸入特征圖的大小一致。通過 shifted windowmask 操作,模型不僅保留了原始的窗口內的自注意力計算,還增強了窗口之間的信息交換和融合。即使窗口被移動了,經過計算后的特征也需要回到其原本的位置,也就是還原平移,保持圖像的完整性。

2.6. PatchMerging

????????PatchMergingSwin Transformer 中的一種下采樣操作,但是不同于池化,這個相當于間接的(對H和W維度進行間隔采樣后拼接在一起,得到H/2,W/2,C*4),目的是將輸入特征圖的空間維度(即高和寬)逐漸減小,同時增加通道數,從而在保持計算效率的同時獲得更高層次的特征表示。它是下采樣的過程,但與常規的池化操作不同,PatchMerging 通過將相鄰的 patch 拼接在一起,并對拼接后的特征進行線性變換,從而實現下采樣。具體來說,在 Swin Transformer 中,隨著網絡層數的加深,輸入的特征圖會逐漸減小其空間尺寸(即 H 和 W 維度),而同時增加其通道數(即 C 維度),以便模型可以捕捉到更為復雜的高層次信息。

????????假設輸入的特征圖形狀為 H x W x CPatchMerging 通過以下步驟來實現下采樣和通道數擴展:

  • 分割和拼接(Splitting and Concatenation)

    • 輸入的特征圖會按照一定的步長(通常是 2)進行分割,即對每個 2x2 的 patch 進行合并。
    • 這樣原本的 H x W 的空間尺寸會縮小一半,變成 H/2 x W/2
    • 然后,將每個 2x2 的 patch 內部的特征進行拼接,得到新的特征維度。假設原始通道數為 C,拼接后的通道數為 4C
  • 卷積操作

    • 對拼接后的特征進行 卷積,以進一步增強特征表達。卷積操作用于轉換特征空間,雖然通道數增加了,但通過卷積,特征能夠更加豐富。

2.7. 分層計算

????????在 Swin Transformer 中,模型的每一層都會進行下采樣操作,同時逐步增加通道數。每次 PatchMerging 后的特征圖會作為輸入進入下一層的 Attention 計算。通過這種方式,Swin Transformer 能夠逐漸提取到越來越復雜的特征,同時保持計算效率。每一層的 PatchMerging 操作實際上是將輸入的特征圖通過 線性變換(通常是卷積)合并成更高維度的特征圖,從而為后續的注意力計算提供更豐富的表示。

? ? ? ? 從圖中可以得到,通道數在每層中并不是從C變成4C而是2C,這是因為中間又加了一層卷積操作。

3.?實驗結果

????????在ImageNet22K數據集上,準確率能達到驚人的86.4%。另外在檢測,分割等任務上表現也很優異。

參考資料:

【深度學習】詳解 Swin Transformer (SwinT)-CSDN博客

深度學習之Swin Transformer學習篇(詳細 - 附代碼)_swintransformer訓練-CSDN博客

圖解Swin Transformer - 知乎

【論文精讀】Swin Transformer - 知乎

ICCV2021最佳論文:Swin Transformer論文解讀+源碼復現,迪哥帶你從零解讀霸榜各大CV任務的Swin Transformer模型!_嗶哩嗶哩_bilibili

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63152.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始學習 sg200x 多核開發之 sophpi 編譯生成 fip.bin 流程梳理

本文主要介紹 sophpi 編譯生成 fip.bin 流程。 1、編譯前準備 sophpi 的基本編譯流程如下: $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注: 需要在 bash 下運行clean_all 非必要可以不…

mysql客戶端命令

目錄 結束符 ; \g \G 中斷輸入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ?編輯 notee (\t) prompt (\R) source (\.) system (\!) ?編輯 use (\u) help contents 結束符 ; \g \G 當我…

scala隱式函數

1 定義 通常我們所說的隱式函數也稱為 隱式轉換,是使用 implicit 修飾的函數 作用: 可以通過一個隱式函數將一種類型轉變為另一種類型 隱式轉換有兩種應用場景: 類型轉換,隱式轉換為期望類型 類型增強 2 示例 ①:類…

Tomcat原理(4)——嘗試手動Servlet的實現

目錄 一、什么是Servlet 1.servlet的定義 2.servlet的結構 二、實現servlet的流程圖 三、具體實現代碼 1、server 2.實體類request&response 3.HttpServlet抽象類 4.再定義三個servlet進行測試 Tomcat原理(3)——靜&動態資源以及運行項…

Node.js內置模塊

1.內置模塊 Node.js的中文網參考手冊:https://nodejs.cn//api 幫助文檔 API文檔:查看對應的模塊,左邊是模塊,右邊是模塊的成員 源碼:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 創建web服務器的模塊 -->進入源碼中,搜索…

【RAG實戰】RAG與大模型應用

1.1 大模型應用的方向:RAG 1.1.1 什么是RAG 1. 生成式AI 一種能夠生成各類內容的技術,包括文本、圖像、音頻和合成數據。自2022年底ChatGPT在全球范圍內推廣以來,基于Transformer解碼器結構的大模型已能在短時間內為用戶生成高質量的文本、…

基于DeepSpeed Chat詳解 PPO 算法中的actor_loss_fn及其核心參數

詳解 PPO 算法中的 actor_loss_fn 及其核心參數 1. 引言 在強化學習中,PPO(Proximal Policy Optimization,近端策略優化)算法是一種經典且高效的策略優化方法。它通過重要性采樣(Importance Sampling)和策…

D3 基礎1

D3 D3.js (Data-Driven Documents) 是一個基于 JavaScript 的庫&#xff0c;用于生成動態、交互式數據可視化。它通過操作文檔對象模型 (DOM) 來生成數據驅動的圖形。官方網站是 https://d3js.org/ <!DOCTYPE html> <html lang"en"><head><me…

基線檢查:Windows安全基線.【手動 || 自動】

基線定義 基線通常指配置和管理系統的詳細描述&#xff0c;或者說是最低的安全要求&#xff0c;它包括服務和應用程序設置、操作系統組件的配置、權限和權利分配、管理規則等。 基線檢查內容 主要包括賬號配置安全、口令配置安全、授權配置、日志配置、IP通信配置等方面內容&…

Python -- Linux中的Matplotlib圖中無法顯示中文 (中文為方框)

目的 用matplotlib生成的圖中文無法正常顯示 方法 主要原因: 沒找到字體 進入windows系統的C:\Windows\Fonts目錄, 復制自己想要的字體 粘貼到Linux服務器中對應python文件所處的文件夾內 設置字體: 設置好字體文件的路徑在需要對字體設置的地方設置字體 效果 中文正常顯…

快速理解類的加載過程

當程序主動使用某個類時&#xff0c;如果該類還未加載到內存中&#xff0c;則系統會通過如下三個步驟來對該類進行初始化&#xff1a; 1.加載&#xff1a;將class文件字節碼內容加載到內存中&#xff0c;并將這些靜態數據轉換成方法區的運行時數據結構&#xff0c;然后生成一個…

搭建 Elasticsearch 集群:完整教程

本文將詳細介紹如何在 Linux 環境下搭建一個 Elasticsearch 集群&#xff0c;涵蓋環境準備、配置優化、服務啟動等多個環節。 一、環境準備 創建安裝目錄 mkdir /es cd /es解壓 Elasticsearch 安裝包 tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz -C /es配置環境變量 編…

寶塔-docker拉取寶塔鏡像,并運行寶塔鏡像

寶塔-拉取寶塔鏡像&#xff0c;并運行鏡像 第1步&#xff1a;查詢 docker search btpanel/baota此docker鏡像由堡塔安全官方發布&#xff0c;鏡像版本為寶塔面板9.2.0正式版和9.0.0_lts 穩定版&#xff0c;鏡像會隨著寶塔面板更新。 目前支持x86_64和arm架構可供下載使用 版本…

使用 Valgrind 檢測 C 程序中的內存問題 -基礎教程

內存泄漏是許多 C 語言程序中的常見問題&#xff0c;它不僅會導致程序性能下降&#xff0c;甚至可能讓系統崩潰。為了檢測和修復這些問題&#xff0c;Valgrind 是一個非常強大的工具&#xff0c;它可以幫助我們分析 C 程序中的內存使用情況&#xff0c;檢測內存泄漏、越界訪問、…

窮舉vs暴搜vs深搜vs回溯vs剪枝專題一>子集

題目&#xff1a; 兩個方法本質就是決策樹的畫法不同 方法一解析&#xff1a; 代碼&#xff1a; class Solution {private List<List<Integer>> ret;//返回結果private List<Integer> path;//記錄路徑&#xff0c;注意返回現場public List<List<Int…

leecode雙指針部分題目

leecode雙指針部分題目 1. 驗證回文串2. 判斷子序列3. 兩數之和 II - 輸入有序數組4. 盛最多水的容器5. 三數之和 1. 驗證回文串 如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后&#xff0c;短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 …

Web 應用如何使用sqlite?使用 sql.js 實現前端 SQLite 數據庫操作

前言 在 Web 應用開發中&#xff0c;前端數據處理的重要性日益增加。為了實現更高效的前端數據管理&#xff0c;特別是在處理結構化數據時&#xff0c;sql.js 提供了一個出色的解決方案。sql.js 是將 SQLite 數據庫編譯為 JavaScript 的庫&#xff0c;允許開發者在瀏覽器環境中…

docker 安裝 mysql8.0容器外無法連接

文章目錄 概要問題描述解決方案其他命令 概要 主要是mysql5.7和mysql8.0的兼容性問題。 排查了很久 其實就是配置文件的一句話的事情 感覺mysql8.0更為嚴謹 這樣可能是考慮杜絕一些漏洞吧 問題描述 在容器內 netstat -an | grep 3306 都不行 在容器外 netstat -an | grep 2…

TCP協議簡單分析和握手揮手過程

TCP介紹 TCP是可靠的傳輸層協議&#xff0c;建立連接之前會經歷3次握手的階段。 確認機制&#xff1a;接受方 收到數據之后會向 發送方 回復ACK重傳機制&#xff1a;發送方 在一定時間內沒有收到 接收方的ACK就會重新發送 握手目的&#xff1a;與端口建立連接 TCP的三次握手 …

VisualStudio vsix插件自動加載

本文介紹如何在Visual Studio擴展中實現PackageRegistration&#xff0c;包括設置UseManagedResourcesOnly為true&#xff0c;允許背景加載&#xff0c;并針對C#、VB、F#項目提供自動裝載&#xff0c;附官方文檔鏈接。增加以下特性即可…… [PackageRegistration(UseManagedRe…