一、Embedding层
对于标准的Transformer
模块,要求输入的是
token (向量
)
序列,即二维矩阵
[num_token, token_dim]
在代码实现中,直接通过一个卷积层来实现以ViT- B/16为例,使用卷积核大小为
16x16
,
stride
为
16
, 卷积核个数为768
[224, 224, 3] -> [14, 14, 768] -> [196, 768]
在输入Transformer Encoder
之前需要加上
[class]token 以及Position Embedding
,都是可训练参数;拼接[class]token: Cat([1, 768], [196, 768]) -> [197, 768] ;叠加Position Embedding: [197, 768]-> [197, 768]
使用位置编码效果会好一点,而使用1D,2D,相对位置编码,效果差不多
二、Transformer Encoder层
注意,在Transformer Encoder前 有个Dropout层,后有一个Layer Norm
训练
ImageNet21K
时是由 Linear+tanh激活函数
+Linear ;但是迁移到ImageNet1K
上或者你自己的数据上时,只有一个 Linear