# Week22: An Image is worth 16X16 words: Transformers for Image Recognition at scale ###### tags: `技術研討` > 簡稱:Vision Transformer, VIT ## Contribution 將tranformer應用在影像分類上 ## Pipeline of VIT ![](https://i.imgur.com/o4KnQhd.png) 1. 準備Transformer Encoder的Input Sequence - Patch Embedding 1. 將圖片切成長寬是$P \times P$的子圖片, 接者將其flatten成長度為$P^2\times C$的向量 例:假設Input RGB Image的size是$27 \times 27$, $P=9$, 則會把切成$9$個$9^2\times 3$的向量 2. 將每個向量經過Linear Layer轉換成D維的向量 :::info 等價於在Input Image上做一個kernel size是$P \times P$, stride是$P$的Convolution ::: - Position Embedding * 使用Standard learnable 1D position embeddings(每個Patch Embedding配上一個$1 \times D$維的Parameter) - class token * 跟BERT的策略一樣, 在第一個位置放一個class token($1 \times D$維的Parameter) * 目的: 利用class token的output embedding進行影像分類 2. 數個Transformer Encoder Block 3. 最後提取class token的output embedding當作MLP(Linear Layer)的Input進行分類 ## Q&A Q: 為何需要class token?為什麼不用input sequence裡的其他element的output embedding就好了? A: Paper上的主文是說學BERT的, 但在Appendix有討論這個問題, 發現Learning rate影響比較大(?) ![](https://i.imgur.com/hAHntZL.png) Q: 為何class token是放在第一個位置? A: 在這個Pipeline下, 因為是transformer是Bi-directional,所以放在哪裡都關係,但在BERT下因為要考慮還有其他TOKEN的問題(sep, mask)才有class token的順序問題 Q: 當Testing Input Size跟Training Input Size不一樣怎麼辦? A: Patch Size保持一樣, Position Embedding採用bilinear的方式產生(像是image resize) ## Experiment - Experiment Setting ![](https://i.imgur.com/o9P1wak.png) - Training Dataset Setting - JFT : 18k classes and 303M images - I21k : 21k classes and 14M images - ImageNet : 1k classes and 1.3M images - 與SOTA的影像分類模型比較 ![](https://i.imgur.com/1QiCmCA.png) - Pre-traing data requirement ![](https://i.imgur.com/GrjnHaO.png) - Transformer缺少CNN的一些特質(平移不變性), 需要大量資料學這些特質 - Performance versus pre-training compute for different architectures ![](https://i.imgur.com/pLHsK8t.png) - Hyprid: 產生Patch Embedding的方式改成用ResNet50