Pytorch實作系列 — ViT

mz bai
Dec 8, 2024

--

ViT 是由 Dosovitskiy et al.(2020, Google)在 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 提出,是一種主流的影像分類transformer,也是前期與CNN競爭電腦視覺地位的attention network。

網路概念

ViT 全名 Vision transformer,將圖片切成一個個區塊(patch)當成token,讓transformer進行序列分類。

不過儘管主打不用卷積也能做影像分類,仍可直接使用CNN的特徵圖作混搭。而處理概念上與CRNN、Show and tell、DETR等都類似,利用局部資訊結合順序建模捕捉鄰域結構或全域結構。

網路結構

ViT與Transformer的區塊有些許不同,在於 LayerNorm 是置於 Linear 之前,其他都一樣。 架構與 BERT基本相同,輸入先將圖片的patch攤平,作為embedding vector 與 position encoding 結合,且使用 [cls] token作為分類標記。

ViT architecture

另一種hybrid做法,是採用CNN特徵圖取代輸入圖片,想必在較小的patch上,計算效率跟效果可能會好一點,有點Faster RCNN的味道。而這個做法也類似在CNN後加上attention增強全域關係的捕捉,就像DeepLab結合DenseCRF。

資料集

Animals-10,一個包含十種動物,兩萬八千多張照片的資料集。

評估

ViT_base_192_16x16,訓練準確度達到70%,沒有在ImageNet pretrain。模型大小為21MiB。

Hybrid model也很容易做,有興趣可以試試

要注意的是,Position encoding有固定的網格大小,所以使用在不同解析度的圖片需要結合插值方法。

實作

參考

--

--

mz bai
mz bai

Written by mz bai

Math is math, math is universal Code is code, code is horrifying unique.

No responses yet