網(wǎng)站優(yōu)化公司方案代引流推廣公司
Vision Transformer模型入門
- 一、Vision Transformer 模型
- 1,Embedding 層結構詳解
- 2,Transformer Encoder 詳解
- 3,MLP Head 詳解
- 二、ViT-B/16 網(wǎng)絡結構
- 三、Hybrid 模型詳解
- 四、ViT 模型搭建參數(shù)
一、Vision Transformer 模型
總體三個模塊:Embedding層、Transformer Encoder、MLP Head(分類層)
注:以下層結構講解均以ViT-B/16為例
1,Embedding 層結構詳解
Transformer 要求 token 向量,需要 Embedding 層做數(shù)據(jù)轉換。將一張圖根據(jù)給定大小分為一堆 patches。
例如 224 x 224 的圖片按照 16 x 16 的 patch 劃分,得到(224 / 16)2 = 196 個 patches。接著將每個 patch 映射到一維向量,即每個 patch 的 shape [16,16,3] 通過映射得到一個長度為 768 的向量(即為Transformer 所需的 token 向量)。
代碼實現(xiàn):通過一個 16 x 16 的卷積核,步距 16,卷積個數(shù) 768 實現(xiàn)。shape [224,224,3] -> [14,14,768],再把 H 和 W 兩個維度展平,[14,14,768] -> [196,768]
在輸入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。
在剛剛得到的一堆 tokens 中插入一個專門用于分類的 [class]token,這個 [class]token 是一個可訓練的參數(shù),數(shù)據(jù)格式和其他 token 一樣都是一個向量。以 ViT-B/16 為例,就是一個長度為768的向量,與之前從圖片中生成的 tokens 拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。
關于 Position Embedding 就是 Transformer 中的 Positional Encoding,采用的是一個可訓練的參數(shù)(1D Pos. Emb.),是直接疊加在 tokens 上的(add),所以 shape 要一樣。以 ViT-B/16 為例,剛剛拼接 [class]token 后 shape 是 [197, 768],那么這里的 Position Embedding 的 shape 也是 [197, 768]。
2,Transformer Encoder 詳解
Transformer Encoder 其實就是重復堆疊 Encoder Block L次,主要由以下幾部分組成:
- Layer Norm:對每個 token 進行 Norm 處理(層歸一化)
- Multi-Head Attention
- Dropout/DropPath
- MLP Block:全連接 + GELU 激活函數(shù) + Dropout 組成,需要注意第一個全連接層會把輸入節(jié)點個數(shù)翻 4 倍 [197, 768] -> [197, 3072],第二個全連接層會還原回原節(jié)點個數(shù) [197, 3072] -> [197, 768]
注意:Transformer Encoder后還有一個 Layer Norm 沒有畫出來
3,MLP Head 詳解
上面通過 Transformer Encoder 后輸出的 shape 和輸入的 shape 是保持不變的,以 ViT-B/16 為例,輸入的是 [197, 768] 輸出的還是 [197, 768]。
這里我們只需要分類信息,所以只需提取出 [class]token 生成的對應結果就行,即 [197, 768] 中抽取出 [class]token 對應的 [1, 768]。接著通過 MLP Head 得到最終的分類結果。
二、ViT-B/16 網(wǎng)絡結構
三、Hybrid 模型詳解
Hybrid 混合模型就是將傳統(tǒng) CNN 特征提取和 Transformer 進行結合。下圖繪制的是以 ResNet50 作為特征提取器的混合模型。
但這里的 Resnet 與之前講的 Resnet 有些不同。
- R50 的卷積層采用的 StdConv2d 而不是傳統(tǒng)的 Conv2d
- 所有的 BatchNorm 層替換成 GroupNorm 層
- 在原 Resnet50 網(wǎng)絡中,stage1 重復堆疊 3 次,stage2 重復堆疊 4 次,stage3 重復堆疊 6 次,stage4 重復堆疊 3 次,但在這里的R50 中,把 stage4 中的 3 個 Block 移至 stage3 中,所以 stage3 中共重復堆疊 9 次
通過 R50 Backbone 進行特征提取后,得到的特征矩陣 shape 是 [14, 14, 1024],接著再輸入 Patch Embedding 層,注意Patch Embedding中卷積層 Conv2d 的 kernel_size 和 stride 都變成了 1,只是用來調整 channel。后面的部分和前面ViT中講的完全一樣。
四、ViT 模型搭建參數(shù)
下面給出三個模型(Base/ Large/ Huge)的參數(shù),其中,
- Layers 就是 Transformer Encoder 中重復堆疊 Encoder Block 的次數(shù)
- Hidden Size 就是對應通過 Embedding 層后每個 token 的 dim(向量的長度)
- MLP size 是 Transformer Encoder 中 MLP Block 第一個全連接的節(jié)點個數(shù)(是 Hidden Size 的四倍)
- Heads 代表 Transformer 中 Multi-Head Attention 的 heads 數(shù)
Model | Patch Size | Layers | Hidden Size D | MLP size | Heads | Params |
---|---|---|---|---|---|---|
ViT-Base | 16x16 | 12 | 768 | 3072 | 12 | 86M |
ViT-Large | 16x16 | 24 | 1024 | 4096 | 16 | 307M |
ViT-Huge | 14x14 | 32 | 1280 | 5120 | 16 | 632M |