模型最重要的部分——怎么把cv问题转到nlp问题,即图片到tokens
参考B站:
37分 走一遍单张图片的前向(多张只需在所有尺寸的最前面加上batch size即可): 1.224x224x3------------------------输入图片尺寸 2.196x768---------------------------分割为尺寸为16x16的patch序列s。通道数变为768,768这个数是怎么出来的?16x16x3=768,即可以理解为把每个小patch的所有信息压成一个向量。196怎么来的?14*14=196,即边长为224的一整张图片分成的patch的总数目。
3.196x768------------------------通过768x768全连接层形成tokens,维度不变 4.197x768----------------------添加特殊的cls_token,这个cls_token设置为可以学习的参数。(见上图左下角) 5.197x768---------------------对每个token叠加各自的位置编码,一个token对应一个独特的位置编码,为1x768的向量(即1D的位置编码)。 后面输入transformer,和经典的nlp版本没区别了。 D=768,这个token的维度参数在ViT是从头到尾不变的。
关于位置编码
经典的nlp 1D的位置编码和考虑2D位置的位置编码经过实验,效果差不多。可能是由于tokens的数目不大。
标准的transformer也能做视觉——作者的倔强
ViT仅仅使用cls_token经过transformer主体后的输出,经过MLP分类头做分类任务 事实上,不使用cls_token,而直接用所有token的输出做处理也可以做分类任务(效果和使用cls_token差不多)。作者为了证明标准的transformer也可以做视觉(通用人工智能),而不是某种技巧的堆砌保证ViT的效果。
多注意力的维度问题
D
/
注
意
力
头
数
D/注意力头数
D/注意力头数是每个新的Qi,Kj,Vk(i,j,k=1,…注意力头数)的维度,做完注意力拼接起这些头的输出,维度又回到了D。
|