Swin Transformer:用Transformer實現CNN多尺度操作

文本是關于Swin Transformer基礎知識的了解

論文:https://arxiv.org/pdf/2103.14030

項目:https://github. com/microsoft/Swin-Transformer.

實現一個Swin Transformer:Swin Transformer模型具體代碼實現-CSDN博客

Swin Transformer mlp版本實現:Swin Transformer 變體1:使用MLP代替多頭注意力機制-CSDN博客

Swin Transformer v2版本實現:Swin Transformer變體2:Swin Transformerv2模型-CSDN博客

原理總覽:

1、總述:

Swin Transformer和Vision Transformer很像,他們都是將NLP領域的Transformer架構引入計算機視覺領域期待大力出奇跡的產物,不同的是,Vision Transformer由于它固定的尺度(16x16大小的patch),它并不適合密集預測,比較適合于圖像分類任務,對于目標檢測、語義分割這種任務就有點困難,而且最主要的問題是,ViT使用的是全局注意力機制,這種注意力的最大問題是計算成本和內存消耗太大。而Swin transformer的目標不是做一類任務,它想做視覺任務的骨干模型。

Swin Transformer 做出的第一大改進就是在窗口內計算注意力,這樣的話就把復雜度從與圖片大小的平方關系改進到了線性關系,因為窗口內計算注意力的計算量相比全局注意力的計算量差距很大,很多個窗口完全可以并行在batch中計算。

第二大改進就是引入了移動窗口,因為Swin Transformer 使用窗口注意力,那么就有一個問題,不同窗口之間的信息怎么交互呢,作者引入了窗口移動機制,使用兩個block層,第一個block層中使用現有的窗口做自注意力計算,之后移動窗口,具體來說就是將patch矩陣沿著右下角移動window_size//2個單位,之后在第二個block中計算新的窗口中的注意力計算,在計算完成之后進行反向移動操作,將之前的移位操作復原。

第三大改進就是學習CNN的pooling機制,實現了層次化的多尺度建模,這樣的話有助于學習不同尺度的特征,對密集預測十分有幫助,這點在論文的實驗結果部分表現得很清楚。

Swin Transformer的這些特性使其與廣泛的視覺任務兼容,包括圖像分類(在ImageNet-1K上達到87.3%的top-1準確率)和密集預測任務,如目標檢測(在COCO測試集上達到58.7的box AP和51.1的mask AP)和語義分割(在ADE20K驗證集上達到53.5的mIoU)。其性能超越了之前的最先進水平,COCO上提高了+2.7 box AP和+2.6 mask AP,ADE20K上提高了+3.2 mIoU,展示了基于Transformer的模型作為視覺骨干網絡的潛力。層次化設計和移動窗口方法也證明了對全MLP架構的益處。

2、總體架構:

Swin Transformer總體來說分為4個階段:

首先,對于輸入的圖像數據,需要先進行Patch Partition操作,也就是分塊,這里的patch大小為4x4,相比于ViT的patch大小16x16,Swin Transformer的每個patch可以保留更細節的信息。如上圖,(H//4)*(W//4)表示的是patch數量,48表示的是3x4x4,也就是一個patch的三個通道的所有像素的拼接,以此作為每個patch的特征,之后經過嵌入,將48映射為C(tiny和small模型中默認為96,big和large模型默認為192),這里所有的操作其實在代碼實現中都是通過一個卷積層實現的,具體可以參考ViT的實現。

2.1、stage 1:

上圖架構是Swin Transformer-T模型的架構圖,他的第一階段有2個block層,在Swin Transformer中,2個block作為一組同時出現,所以每個階段的block數量都為偶數:

在第一個階段中,對于輸入的數據【B,H//4*W//4,C】:

在第一個block中不進行窗口移動,只進行窗口自注意力計算,我們可以詳細分析一下這中間的特征形狀變化:對于輸入數據形狀 :【B,H//4*W//4,C】,首先將一維序列展開為二位序列:【B,H//4,W//4,C】,之后劃分窗口:【B*num_windows,windows_size,windows_size,C】,其中windows_size是窗口大小,默認為7,num_windows為窗口數量=(H//4//windows_siz,W//4//windows_size),之后根據每個block的注意力頭的數量重塑形狀為:【B*num_windows,head,windows_size*windows_size,C//head】,其中,windows_size*windows_size就是一個窗口內的序列長度,C//head就是每個元素的特征,這樣的話,就把原本ViT的全局注意力計算變為了窗口注意力計算(ViT:【B,head,(H//16)*(W//16)+1,C//head】),這里需要注意,在計算完計算力得分之后,還有一個相對位置偏移需要相加,這一點將在本章的第5節講解。計算完注意力,需要將窗口合并,即形狀變為【B,H//4,W//4,C】,之后將數據形狀重塑回到原始形狀【B,H//4*W//4,C】即可進入下一個block。

在第二個block中,需要進行窗口的移動,這個操作在劃分窗口前進行,只需要調用torch.roll函數即可。在注意力計算階段,由于窗口發生了變化,相對應的注意力計算區域也發生了變化,為了保證窗口數量不變以及不計算不應該計算位置的注意力得分,這里對于QK^{T}的結果要進行掩碼處理,具體操作在本章的第6節講解。進行完注意力計算之后,需要進行窗口合并,即形狀變為【B,H//4,W//4,C】,然后將之前移動的窗口還原,之后將數據形狀重塑回到原始形狀【B,H//4*W//4,C】

2.2、stage 2:

stage 2第一個操作是降采樣操作,也就是patch_merging,這個將在本章的第三節進行講解,降采樣的結果就是將圖像尺寸減半,將通道加倍,這個操作是在模仿CNN中的池化操作,經過該操作輸入數據變為【B,H//8*W//8,2C】

stage 2 的Swin Transformer block的流程和stage1 完全一致,就是輸入數據形狀不一樣。

2.3、stage 3:

stage 3第一個操作和stage 2一樣,都是降采樣把圖像尺寸減半,將通道加倍,這個操作是在模仿CNN中的池化操作,經過該操作輸入數據變為【B,H//16*W//16,4C】

stage 3 的Swin Transformer block的流程和stage1 完全一致,就是輸入數據形狀不一樣,同時stage 3有6個block。

2.4、stage 4:

stage 4第一個操作和stage 2一樣,都是降采樣把圖像尺寸減半,將通道加倍,這個操作是在模仿CNN中的池化操作,經過該操作輸入數據變為【B,H//32*W//32,8C】

stage 4 的Swin Transformer block的流程和stage1 完全一致,就是輸入數據形狀不一樣。

2.5、輸出處理:

stage 4的輸出經過平均池化和壓縮之后,得到輸出結果,形狀為:[B, num_features],之后經過Swin Transformer head的映射,輸出結果[B, num_classes]

3、patch_merging:

該模塊是模型的降采樣模塊,是把圖像尺寸減半,將通道加倍,這個操作是在模仿CNN中的池化操作。下面的圖可以簡要描述這種操作:

上圖中的1,2,3,4代表的是應該在分割后歸屬的圖的標號而不是真實值,按照上圖所示的邏輯,將原始數據分割為4部分,每一部分形狀為?【B,H//2,W//2,C】,在C通道維度拼接為【B,H//2,W//2,4C】,之后將4C維度映射為2C:【B,H//2,W//2,2C】

4、窗口自注意力機制和全局自注意力機制運算量:

\Omega (MSA)=4hwC^{2}+2(hw)^{2}C

\Omega (WMSA)=4hwC^{2}+2M^{2}hwC?

其中,h和w是圖像的高和寬,C是通道數量,M是窗口大小。

我們知道全局多頭自注意力機制的運算包括4個矩陣映射、2個矩陣乘法,其中,矩陣映射是K、Q、V(h*w*C)與C*C的矩陣的相乘,運算量為3hwC^{2},當計算完注意力分數之后,要將attn經過映射輸出,這部分也是h*w*C與C*C的矩陣的相乘,運算量為hwC^{2}。兩個矩陣乘法是QK^{T}AV,他們都是h*w*C與C*h*w矩陣乘法,運算量都為(hw)^{2}C,所以全局注意力運算量總和為4hwC^{2}+2(hw)^{2}C

窗口多頭自注意力機制的運算也包括4個矩陣映射、2個矩陣乘法,其中,矩陣映射是K、Q、V(M*M*C)與C*C的矩陣的相乘,運算量為3M^{2}C^{2},當計算完注意力分數之后,要將attn經過映射輸出,這部分也是M*M*C與C*C的矩陣的相乘,運算量為M^{2}C^{2}。兩個矩陣乘法是QK^{T}AV,他們都是M*M*C與C*M*M矩陣乘法,運算量都為M^{4}C,所以一個窗口注意力運算量總和為4M^{2}C^{2}+2M^{4}C,總的窗口個數是(h//M)*(w//M),相乘得到窗口注意力運算量總和為4{hw}C^{2}+2M^{2}hwC

5、相對位置偏移:

為什么要采用相對位置?ViT的結果表明使用相對位置和絕對位置對最后的分類結果影響不大,但是Swin Transformer它的用途不局限于圖像分類,在目標檢測、語義分割等密集預測任務中,使用相對位置比使用絕對位置的效果要好很多,這一點作者做了消融實驗,結果如下:

Swin Transformer的相對位置偏移表大小為【(2M-1)*(2M-1),head_num】,其中,2M-1是窗口的高和寬的相對位置范圍,即如果M=3,那么(-2,-1,0,1,2)就是相對位置范圍。相對位置偏移表是一個可學習的參數表。

然后使用窗口的高和寬堆疊形成二維網格,之后壓縮形成【2,M*M】的網格坐標,之后計算第一個M*M坐標和第二個M*M坐標每一對之間的相對坐標差,得到【2,M*M,M*M】,之后重塑形狀為【M*M,M*M,2】并給每一個元素加上M-1使得所有元素均不為負,這是因為這些坐標差之后要作為index在相對位置偏移表中取值,之后將最后一維求和得到【M*M,M*M】,將其作為相對位置索引表

當計算完QK^{T}之后,將相對位置索引表中所有元素對應于相對位置偏移表中的head_num維向量取出并重塑形狀為【head_num,M*M,M*M】。

我們可以回憶一下QK^{T}的形狀:【B,head_num,patch_num,patch_num】,其中patch_num=M*M,那么我們給【head_num,M*M,M*M】擴充第零維之后利用廣播就可以實現相對位置偏移和QK^{T}的相加。

6、窗口移動:

我們知道Swin Transformer的特殊點就在于其可以移動的窗口,但是移動窗口就會出現一個問題:

一個原始特征圖如果有4個窗口,沿著右下角移動window_size//2個單位后會發現出現了9個窗口,我們知道如果窗口高和寬不一致,我們無法使用注意力機制,這時最簡單的辦法就是填充,將高和寬不一致的窗口用0填充至高和寬一致,這樣做很簡單,但是相應的計算量就上升了,這對于我們來說是不利的,所以我們換一種思路,引入掩碼操作:

上圖中,每種顏色覆蓋范圍代表一個邏輯上形式上的窗口(4個),每種數字標識一個實際的窗口(9個),在同一個顏色的邏輯窗口內可能會存在不同的實際窗口,我們可以給一個邏輯窗口內的所有實際窗口做差值,使得掩碼中同一個實際窗口中的元素為0,非該實際窗口中的元素為-100,計算注意力時使用的是邏輯上的窗口,這樣能保證窗口數量不變。把這個掩碼值加入到QK^{T}結果中,做softmax操作就可以不需要計算注意力的地方置為0。

實驗結果:

1、分類任務:

2、目標檢測任務:

3、語義識別任務:

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

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

相關文章

系列2:基于Centos-8.6Kubernetes 集成GPU資源信息

每日禪語 自省,就是自我反省、自我檢查,自知己短,從而彌補短處、糾正過失。佛陀強調自覺覺他,強調以達到覺行圓滿為修行的最高境界。要改正錯誤,除了虛心接受他人意見之外,還要不忘時時觀照己身。自省自悟之…

flutter控件buildDragTargetWidget詳解

文章目錄 1. DragTarget 的核心概念基本屬性 2. 基本用法3. 使用 buildDragTargetWidget4. 常見場景5. 注意事項 buildDragTargetWidget 不是 Flutter 中的內置 API 或方法,但根據命名習慣,它很可能是您正在實現或使用的一個方法,用于在 Flut…

MySQL遷移SQLite

將 MySQL 的表結構和數據遷移到 SQLite,可以通過以下步驟實現。這個過程主要包括導出 MySQL 數據庫到 SQL 文件,然后將其導入到 SQLite 數據庫中。 步驟 1: 導出 MySQL 數據庫 首先,需要將 MySQL 數據庫導出為一個 SQL 文件。可以使用 mysq…

【數據結構——內排序】二路歸并排序(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 測試說明 我的通關代碼: 測試結果: 任務描述 本關任務:實現二路歸并算法。 測試說明 平臺會對你編寫的代碼進行測試: 測試輸入示例: 11 18 2 20 34 12 32 6 16 5 8 1 (說明:第一行是元…

近期數據安全事件通報處罰案例分析與建議

近期典型事件案例 案例一:北京某公司未建立數據安全管理制度和操作規程,造成大量公民個人信息泄露 北京某公司的數據管理人員,某天發現公司的客戶數據疑似泄露在境外非法網站上隨后報警。經檢查,該公司的技術人員在數據庫系統測試…

基于 webRTC Vue 的局域網 文件傳輸工具

文件傳輸工具,匿名加密,只需訪問網頁,即可連接到其他設備,基于 webRTC 和 Vue.js coturn TURN 服務器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…

【FFmpeg】FFmpeg 內存結構 ⑥ ( 搭建開發環境 | AVPacket 創建與釋放代碼分析 | AVPacket 內存使用注意事項 )

文章目錄 一、搭建開發環境1、開發環境搭建參考2、項目搭建 二、AVPacket 創建與釋放代碼分析1、AVPacket 創建與釋放代碼2、Qt 單步調試方法3、單步調試 - 分析 AVPacket 創建與銷毀代碼 三、AVPacket 內存使用注意事項1、謹慎使用 av_init_packet 函數2、av_init_packet 函數…

D94【python 接口自動化學習】- pytest進階之fixture用法

day94 pytest的fixture詳解 學習日期:20241210 學習目標:pytest基礎用法 -- pytest的fixture詳解 學習筆記: fixture的介紹 fixture是 pytest 用于將測試前后進行預備、清理工作的代碼處理機制。 fixture相對于setup和teardown來說有以…

2024首屆世界酒中國菜國際地理標志產品美食文化節成功舉辦篇章

2024首屆世界酒中國菜國際地理標志產品美食文化節成功舉辦,開啟美食文化交流新篇章 近日,首屆世界酒中國菜國際地理標志產品美食文化節在中國國際地理標志大廈成功舉辦,這場為期三天的美食文化盛會吸引了來自世界各地的美食愛好者、行業專家…

AI發展與LabVIEW程序員就業

人工智能(AI)技術的快速發展確實對許多行業帶來了變革,包括自動化、數據分析、軟件開發等領域。對于LabVIEW程序員來說,AI的崛起確實引發了一個值得關注的問題:AI會不會取代他們的工作,導致大量失業&#x…

展柜設計公司平面布置小程序的分析與設計springboot+論文源碼調試講解

3系統的需求分析 需求分析的任務是通過詳細調查展柜設計公司平面布置小程序軟件所需的對象,充分了解系統的工作概況,明確功能實現的各種需求,然后在此基礎上確定系統的功能。系統必須充分考慮今后可能的擴充和改變。 3.1可行性分析 通過對…

家校通小程序實戰教程10部門管理前后端連接

目錄 1 加載后端的數據2 為什么不直接給變量賦值3 保存部門信息4 最終的效果5 總結 現在部門管理已經完成了后端功能和前端開發,就需要在前端調用后端的數據完成界面的展示,而且在錄入部門信息后需要提交到數據庫里,本篇我們介紹一下前后端如…

spark-sql 備忘錄

wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 讀取json 文件 并通過sql 執行 join 查詢 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…

Java并發編程學習(二)

線程的狀態 有說5種的,有說6種的 5種的,從操作系統層面來講 初始狀態:也就是語言層面創建了線程對象,還未與操作系統線程關聯。Java中也就是new了一個線程,還未調用。可運行狀態:(就緒狀態&a…

Docker方式安裝人人影視離線完整安裝包

本文軟件由網友 ルリデ 推薦; 上周,人人影視創始人宣布將人人影視二十年字幕數據開源分享 目前提供了兩種使用方式: “在線應用” :意味著需要有互聯網才可以使用。官方提供了網站:https://yyets.click “離線使用” …

Leetcode 3389. Minimum Operations to Make Character Frequencies Equal

Leetcode 3389. Minimum Operations to Make Character Frequencies Equal 1. 解題思路2. 代碼實現 題目鏈接:3389. Minimum Operations to Make Character Frequencies Equal 1. 解題思路 這一題從答題從test的結果來說來說做出的人很少,主要確實有些…

大文件處理的終極武器:Yield詳解

【大文件處理的終極武器:Yield詳解】🚀 一、大文件處理的痛點 內存限制數據量巨大傳統方法效率低 二、Yield解決方案 def read_large_file(file_path):with open(file_path, r) as file:# 每次只讀取一行,而不是全文for line in file:yie…

SpringBoot 學習

SpringBoot 學習 什么是 Springboot Spring Boot 是 Spring 提供的一個子項目,用于快速構建 Spring 應用程序 傳統的問題: 導入依賴繁瑣項目配置繁瑣 SpringBoot 的特性 起步依賴:整合所有 web 的依賴配置好了自動配置:bean…

到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率

中心可以根據任務到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率 服務率和到達率 中心可以根據任務到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率服務率(Service Rate)到達率(Arrival Rate)控制參數實現負載均衡的方法在云計…

最新全開源IM即時通訊系統源碼(PC+WEB+IOS+Android)部署指南

全開源IM(即時通訊)系統源碼部署是一個復雜但系統的過程,涉及多個組件和步驟。以下是一個詳細的部署指南,旨在幫助開發者或系統管理員成功部署一個全開源的IM系統,如OpenIM。      IM即時通訊系統源碼準備工作   …