GitHub - lucidrains/vit-pytorch: Implementation of Vision Transformer, a simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch

鉴于上述github主整理了如此多的模型,下面将其列表放上,并尽量整理出一个表格,由精度从低到高显示。

  • Deep ViT
  • CaiT
  • Token-to-Token ViT
  • CCT
  • Cross ViT
  • PiT
  • LeViT
  • CvT
  • Twins SVT
  • RegionViT
  • NesT
  • Masked Autoencoder
  • Simple Masked Image Modeling
  • Masked Patch Prediction
  • Dino

这两张从论文中截的表可以看出RegionViT-B 与NesT-B 、Twins-SVT-L 模型的精度都达到83.8左右 在ImageNet1k数据集上。

这么多模型在Readme 震惊! 最近新出了新模型已经超过ViT

Cross ViT / 何神的MAE 屏蔽自编码神器!

慢慢上新RegionViT: Regional-to-Local Attention for Vision Transformers(83.8)

微软的SimMIM: A Simple Framework for Masked Image Modeling 会马上跟踪上去!

1、ViT模型

将CNN 结构全改成Transformer形式,输入的token 是patch 格式,就是N*N 的patch, N 小于图片的宽和高。而CNN卷积形式,由self-attention 代替。作者在实验的时候发现在小数据集上没有超越ResNet 这种优异的模型,但是当数据集大的时候,可以超越它们。利用数据打败结构!目前ViT github 代码已有 4k star  谷歌巨作。其实在Transformer 模型中,研究人员要不选择目标框的特征做Token , 要不选择 Patch 将图片分成多块做token。

GitHub - google-research/vision_transformer

 直接看结构图,应该都能看懂,利用线性将各个patch 编码成一向量 与位置编码融合输入Transformer 中。其中token序列的第一位为【cls】 token。 为了将其作为分类的标记位。其他Transformer 操作保留。

输入的向量长度需要转换成每层的D维隐藏向量长度,且通过加和形式嵌入位置编码。

公式1 就是指的第一层最终的输入向量形式。后面的字母l 指的是层数。通过Transformer的经典操作MSA 和MLP 构成每一层的操作,最后一层的向量通过公式(4) 输入到分类器层进行图片分类等具体目标任务。0 指的就是【cls】token 的位置序号id。

作者文中指出,最终仍然选用1D 的编码,因为2D 并没有显示出更好的性能。

作者指出其实还有一种Hybrid 框架,例如,上述描述的是直接从源数据的图片直接变换输入到Transformer 。当然这种patch的获得也可以是经过几层CNN ,然后再变成一堆patch 输入到Transformer模型中。

此模型也有两个阶段,大规模数据集预训练和小数据集任务微调。两种阶段的不同在于分类器层的不同。根据具体任务变换输出层的长度。

遵从Bert 的模型大小,ViT也设计了三种尺寸大小的模型,Base Large 和Huge

 可以看出基本所有的ViT都超过了BiT-L 的ResNet 模型的识别精度

预训练数据集的大小分析:

从图三中可以看出,在小数据集中BiT这种ResNet 形式的网络是优于ViT。当数据集的规模变大时,ViT还是可以逆袭的。当然ViT 的模型大小也是随着数据集规模大小而逆袭。

混合模型也就是利用resnet 嵌入patch 向量后面沿用ViT模型仍然出现在小数据集效果好,在大数据逊色于ViT。 难怪,现在大训练集的patch 方式都选择直接的原始数据,而不用经过卷积层,例如最新出的跨模态模型SimVL,同样是Google 出品。

这是可视化第一层嵌入的过滤器,和位置嵌入相似度,可以看出中间图,网络是可以学习到2D的位置编码

2、CrossViT模型

先上图

下面是上面的Cross-Attention 模块的融合方式

本文是第一个探索ViT家族中的多尺度 双分支模型。作者指出这里一大特色就是两个尺度是如何有效的信息融合,作者使用了CLS 位的信息量进行交互评估,极大地减少了模型地交互计算量。

左边是小patch 分支,patch维度小,层数小,

右边是大patch 分支,patch维度大,层数多,

通过两个分支的交互,补充各自的信息。

作者指出ViT模型中16 的小patch 精度是32 大patch 高了6个点,但是计算量空间却极大,作者希望利用多尺度提高精度,且能获得较小的计算量。

作者的框架图是很清晰的。在进入交互层之前,这两个分支分别都融入了位置信息,只是图中没有标记出来而已。最终的图片分类任务是通过两个分支的cls token 的向量分别共同预测即可。

图3的标题其实很清晰,(a)方式所有都融合,没有什么区别性(b)只融合cls 两个,其他不变。(c)成对融合(d)就是作者的最佳融合方式。

从表6作者的实验,发现前三种效果差不多,只有最后一种精度能提高接近1个点。

All-Attention Fusion.

拼接两个分支的token ,然后利用自注意力形式去融合信息,两端拼接后的自注意力操作。

这里应该是两个分支的token拼接通过f 函数化成token 向量一致,然后送入常见的MSA模块,多头注意力,然后将结果进行分片,两边分别通过g函数回归到原先的维度。

Class Token Fusion.

这个计算量贼少,只是将两分支的cls 相加,其他token 不变的传到下一层即可。这里的f 和g 函数仍然是维度转换器,才能进行相加操作和返回原向量维度进行拼接patch。

Pairwise Fusion.

由于patch 大小不同两边的长度也不等。此处为了进行成对操作,采取了插值的方式,使得两分支的长度相等后,然后一一对应进行相加。

虽然想了这么多,看表6 的结果发现,效果都差不多,所以还是实践出真知,看着挺好,运行就不知道什么情况了!

Cross-Attention Fusion.

此处简单来说就是用一个分支的cls 跟另一个分支的patch 们打交道,打完交道后再传递回自己分支的那些patch .emmmmmm, cls 就是融合了所有patch 的信息的使者呀!

此式显示交换cls ,下面两式也非常好理解,就是将一分支的cls 作为查询向量,该cls 与另一分支拼成的patch 们作为key 和value。然后进行多头跨注意力融合。(6)式就是7式MCA的一个头的操作。

然后利用残差和形式得到更新后的cls 。 然后将其与自己分支的patch 们拼接一下。

出自作者github:https://github.com/IBM/CrossViT/blob/main/models/crossvit.pyclass CrossAttention(nn.Module):def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):super().__init__()self.num_heads = num_headshead_dim = dim // num_heads# NOTE scale factor was wrong in my original version, can set manually to be compat with prev weightsself.scale = qk_scale or head_dim ** -0.5self.wq = nn.Linear(dim, dim, bias=qkv_bias)self.wk = nn.Linear(dim, dim, bias=qkv_bias)self.wv = nn.Linear(dim, dim, bias=qkv_bias)self.attn_drop = nn.Dropout(attn_drop)self.proj = nn.Linear(dim, dim)self.proj_drop = nn.Dropout(proj_drop)def forward(self, x):B, N, C = x.shapeq = self.wq(x[:, 0:1, ...]).reshape(B, 1, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3)  # B1C -> B1H(C/H) -> BH1(C/H)k = self.wk(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3)  # BNC -> BNH(C/H) -> BHN(C/H)v = self.wv(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3)  # BNC -> BNH(C/H) -> BHN(C/H)attn = (q @ k.transpose(-2, -1)) * self.scale  # BH1(C/H) @ BH(C/H)N -> BH1Nattn = attn.softmax(dim=-1)attn = self.attn_drop(attn)x = (attn @ v).transpose(1, 2).reshape(B, 1, C)   # (BH1N @ BHN(C/H)) -> BH1(C/H) -> B1H(C/H) -> B1Cx = self.proj(x)x = self.proj_drop(x)return xclass CrossAttentionBlock(nn.Module):def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, has_mlp=True):super().__init__()self.norm1 = norm_layer(dim)self.attn = CrossAttention(dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop)# NOTE: drop path for stochastic depth, we shall see if this is better than dropout hereself.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()self.has_mlp = has_mlpif has_mlp:self.norm2 = norm_layer(dim)mlp_hidden_dim = int(dim * mlp_ratio)self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop)def forward(self, x):x = x[:, 0:1, ...] + self.drop_path(self.attn(self.norm1(x)))if self.has_mlp:x = x + self.drop_path(self.mlp(self.norm2(x)))return x

3、RegionViT模型 

思想:将图片分成多个不重叠的大块,每个大块里面又可以分细小块,然后大块先自注意力得到全局信息,然后将更新后的大块信息与自己所属于的小块信息交流,就可以让小块拥有全局信息。这样相比于ViT 每个小块都要与全图所有小块交流 大大提高了效率,减少了很多计算量。(感觉这个想法还是很容易想到的)

下面是主要的思想图

(a)图为最原始ViT。 ( b)PVT 采用了金字塔形式,随着层数的升高,增加patch 的大小,(c)本模型,在PVT基础上,利用高层的大patch 与其内部的小patch 进行局部交流,减少运算,大patch 进行整图运算,大patch集合了最广的全局信息,通过局部交流让小patch 也能关注到全局信息。

下面是RegionViT 的整体架构图,官网的代码还没有放出来!

在分类任务中,region 分支的平均后输入到分类器层,目标检测用到所有的token 因为都提供了位置信息。

下面是具体的区域与所对应的局部小块如何交互的示意图

4、Masked Autoencoders Are Scalable Vision Learners

何神的作品MAE

先上效果图吧

屏蔽了75%的像素,中间是重建出来的,右边是原图。感觉像去噪自动编码器的工作

哎呀,复制不了到知乎,所以分两部分吧。MAE其他部分看知乎。

ViT家族大杂烩(部分代码移植csdn博客) - 知乎

ViT 家族的大杂烩(An Image is worth 16×16 Words)相关推荐

  1. ViT(Vision Transformer)学习

    ViT(Vison Transformer)学习 Paper:An image is worth 16×16 words: transformers for image recognition at ...

  2. ViT (Visual Transformer)

    Acknowledge 论文名称: An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale 原论文对应源码 ...

  3. ViT作者、谷歌大脑研究员翟晓华:大规模视觉表征学习

    智源导读:从2020年,Transformer开始在CV领域大放异彩.ViT(Vision Transformer)是Google在2020年提出的直接将transformer应用在图像分类的模型,后 ...

  4. LSTM还没「死」!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 如果说「LSTM」已死,它为何依然能够在Kaggle竞赛中成为赢家呢? ...

  5. 深度学习框架-Backbone汇总

    Backbone--  Neck -- Head 1.Backbone:翻译为骨干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?这个主干网络大多时候指的是提取特征的网络,其作用 ...

  6. 视觉Transformer最新综述

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 ©PaperWeekly 原创 · 作者|张一帆 学校|华南理工大学 ...

  7. Swin-Transformer又又又下一城 | 看SwinTrack目标跟踪领域独领风骚

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨集智书童 作者丨ChaucerG Transformer最近在改进视觉跟踪算法方面显示出强大的潜 ...

  8. 中国科学院、东南大学等联合发表最新的视觉 Transformer 综述

    作者丨闪闪红星闪闪@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/433048484 编辑丨极市平台 导读 中国科学院.东南大学等单位联合发表最新的视觉 Transf ...

  9. Intriguing Properties of Vision Transformers论文解析

    Intriguing Properties of Vision Transformers 论文地址 本论文系统研究了基于Transformer和CNN构造的图像分类器一些很多有趣的特性,包括纹理与形状 ...

最新文章

  1. SQLServer之删除约束
  2. Linux中读写权限
  3. 广域网性能优化—Vecloud
  4. 打工人的一把辛酸泪,网站提现为啥多于800要扣20%的税?我想这些东西你需要明白
  5. 65%的家庭有人“啃老”,数据解读国内版巨婴是如何炼成的?
  6. base64原理核心规则
  7. linux ati显卡驱动下载,LINUX 下ati最新显卡驱动下载
  8. sql server根据表中数据生成insert语句
  9. mysql 授权类型_MySQL-02-授权及数据类型
  10. 4.Entity Framework Core 5.0 添加数据
  11. 状态机finite-state machine学习笔记2——按键消抖初步(1)
  12. 一个免费、大小仅几MB但超好用的卸载工具——Geek Uninstaller
  13. NEO的至暗时刻 |链捕手
  14. my.cnf文件的内容详细解释
  15. php 又拍云,DEDEcms图片附件上传到又拍云使用云存储
  16. js实现图片放大镜效果
  17. 【Linux】磁盘类型设备驱动介绍
  18. Python基础入门之切片
  19. [原创插件] [服务端插件] [新手开发者必看]优秀插件开发教程列表 欢迎回复讨论
  20. 成才之路杂志社成才之路编辑部成才之路杂志2022年第33期目录

热门文章

  1. 「Poetize9」升降梯上(tyvj2032)(最短路)
  2. 天工代码生成器标准版正式发布
  3. 【Linux开发环境搭建】arm-linux-gnueabihf 交叉编译工具链安装
  4. 学习riscv-vector加速器(1):搭建pulp-platform/ara的测试环境
  5. 解决win7无法进入睡眠状态的问题
  6. 个人申请支付宝微信支付接口教程(无需营业执照)
  7. 网易博客日志:COSTAS环低通滤波器设计及环路增益设计
  8. Windows 7的四个命令显示详细激活信息
  9. cloudera manager的简单使用
  10. 杰理之调节数字音量不起作用以及调节数字音量影响混响效果的解决办法【篇】