VisionTransformer

VisionTransformer,这是首次将Transformer引入CV的一篇文章

simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch. Significance is further explained in Yannic Kilcher’s video. There’s really not much to code here, but may as well lay it out for everyone so we expedite the attention revolution.
 文章的思路可以说一张图涵盖了所有。
在这里插入图片描述
 从上图中可以很简单直观的看出来其做了什么流程。

  • 首先大力出奇迹,粗暴的直接分解成了九宫格(这里以九宫格举例,实际中应该会分的更多一点)。即分解为了N个Patch。其进行的方式也很粗暴用代码可以表示为rearrange(in,'b c (h_ p1) (w_ p2) ->b (h1 w1) (p1 p2 c),这时候我们得到了一个维度为 ( B , n H ∗ n W , p 2 ∗ c ) 的 序 列 输 入 x 这 里 简 单 的 把 它 维 度 叫 做 ( B , N , D ) (B,nH*nW,p^2*c)的序列输入x这里简单的把它维度叫做(B,N,D) (B,nHnW,p2c)x(B,N,D)
  • 之前注册一个可学习维度大小为 ( 1 , 1 , D ) (1,1,D) (1,1,D)的参数cls_tokens,然后再第一个维度膨胀为B后拼接在第二个维度上cat((x,cls_tokens),dim=1)——这时候的x维度为 ( B , N + 1 , D ) (B,N+1,D) (B,N+1,D)
  • 接着注册一个可学习维度大小为 ( 1 , N + 1 , D ) (1,N+1,D) (1,N+1D)的参数pos_embedding,然后:x+=pos_embedding 并 x=dropout(x)——x维度为(B,N+1,D)
  • 循环执行指定个Transformer Encoder块 循环:x = Transformer(x) 结束循环 ——x维度为(B,N+1,D)
  • 最后进行池化——x的维度变为(B,D)
  • 所有特征提取完毕,接着做什么就自己来啦。
关于VIT的一些想法。

 作者只把图像序列化了然后加入位置嵌入和一个cls_token,然后也只送入了连续的多个Transformer Encoder(Decoder都没有用)就可以达到一个很好的水平,不得不说Vision Transformer提升的空间依旧很大。纯Transformer的注意力机制有着强大的能力。
 但是如果仅仅是粗暴的将其分为了固定的格子,所有的注意力也只作用在这些格子里面,对一些细粒度要求高的语义分割等任务不友好。并且其没有CNN视觉感受野的功能。一些改进可能包括在内部加入卷积模块。或者通过逐步增加Patch块的大小等方式堆砌深度,乃至使用类似特征金字塔进行多尺度的特征提取,在算力足够的情况下应该可以达到更好的效果。MSRA的SwinTransformer就使用了滑动窗口+卷积+堆砌深度,来做到性能和效果的一个很好的均衡。
 卷积归纳偏置对于规模较小的数据集较为有用,但对于较大的数据集而言,学习相关模式就足够了,甚至更加有效。从文中相关的实验可以看出来对于一些小规模的数据集,ViT更容易产生过拟合。对于大规模的数据集来说,尤其是大力出奇迹的谷歌,他们在自家数据集上预训练后,在某些时刻的性能甚至达到或者超过了一些SOTA的模型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值