VIT中提取图像分类特征的详细步骤

图1. VIT结构图

VIT是第一篇纯视觉transformer,被当成了许多网络的backbone。现在自己梳理一下VIT怎么从一张图像中提取特征,最后用于分类的过程。(自己的理解,如有不对,欢迎指正)

处理流程:

第一步:输入一张尺寸为h*w*c的图像;

第二步:将图像分成p*p*c的小块,那么一共可以获得n个图像块【n=(h*w)/(p*p)】,同时添加一个可学习的类别块,则总共有(n+1)个块待处理,这个类别块将用于与所有的图像小块进行交互,最终从类别块中学习到用于分类的特征;

第三步:对图像小块进行flatten操作,即将每个图像块(p*p*c)转换成1*(p*p*c)大小的一维向量,再将n个一维向量拼接起来,组成n*(p*p*c)的二维向量。然后再对二维向量使用全连接层进行降维得到n*d的二维特征a(d由人工设定,1024,2048均可)。至此完成了图1中的linear projection of flattened patches的操作。

第四步:对输入特征加入位置编码。位置编码用于标示每一个图像块的相对位置。关于为什么要加位置编码可参考:This post is all you need(②位置编码与编码解码过程) – 月来客栈

第五步:将预处理特征送入transformer encoder中得到交互特征f。在encoder中最重要的就是多头注意力层,对于输入特征a(n*d),将其划分为m个头,得到m个不同的特征(a1,a2...am)。例如有12个头,则对于某一个输入特征a(n*d),就会划分出12个不同的特征(a1,a2...a12),划分示意图见图2,尺寸为n*(d/12),然后在这12个特征中执行自注意力计算(见图3),得到12个加权特征(b1,...,b12),再将其拼接到一起得到z(n*d),通过非线性变化w,最终得到与输入特征同尺寸的交互特征f(n*d)。

f=w*z,其中w的维度为(n*n),z的维度为(n*d)

第六步:对于经encoder得到的交互特征f(n*d),从中只抽取代表类别块的一维特征(1*d),用作后续的分类。再通过MLP进行降维操作,将d降维为待分类的类别数,即(1*class_num),即可完成分类。

 图2.对输入特征进行多头划分

 图3.多头自注意力计算过程

 整体的维度变化,可参考下图:

  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值