Transformer主干网络——ViT保姆级解析

前言

最近准备跑点主干网络的实验,transformer在cv都杀疯了,整理下最近这些网络的发展以及创新点。从”万恶之源“ViT开始吧。

系列文章

Transformer主干网络——ViT保姆级解析
Transformer主干网络——DeiT保姆级解析
Transformer主干网络——T2T-ViT保姆级解析
Transformer主干网络——TNT保姆级解析
Transformer主干网络——PVT_V1保姆级解析
Transformer主干网络——PVT_V2保姆级解析
Transformer主干网络——Swin保姆级解析
Transformer主干网络——PatchConvNet保姆级解析
持续更新…

结构

Transformer主干网络——ViT保姆级解析_第1张图片
根据上图介绍大致流程,首先一幅建筑的图片,作者将它分为大小相同的9块,
Transformer主干网络——ViT保姆级解析_第2张图片

然后每一块通过展平以及线性层编码成9个特征,
Transformer主干网络——ViT保姆级解析_第3张图片
然后额外拼接一个形状一样的一个特征用于分类:
Transformer主干网络——ViT保姆级解析_第4张图片
接下来,因为将图片分块他们原始对于图像中的位置信息没有了,所以作者加了一个可以学习的位置特征在原特征上,
Transformer主干网络——ViT保姆级解析_第5张图片
注意这里是加,不是拼接,比如说图像块1的特征是(0,0,0,0,0.5,1.0),加上一个可学习的随机初始化的位置编码(0.1,0.2,0,0,0.6,0)之后就得到(0.1,0.2,0,0,1.1,1.0)

接下来把加上位置编码的这10个特征(9个图片块对应的特征加1个分类的特征)送入transformer中,transformer可以理解为里面所做的事情就是让输入的10个特征互相学习互相的信息,然后输出10个学习完互相信息的特征。

因为transformer输入输出的特征shape不变,所以可以拼接不同数目的transformer来构成不同大小的ViT结构。

最后取出第0位的分类特征进行分类任务。

以上就是ViT的基本结构,细节对应的图示如下图:
Transformer主干网络——ViT保姆级解析_第6张图片

留下的坑

ViT可以说是transformer在cv的开山之作了,因此几乎每一个坑就产出了n篇论文,总结下ViT留下的问题:
1、Patch embedding部分(就是将图片分成9块,然后过线性层和展平得到9个特征的部分),ViT通过16 * 16步长为16的卷积实现。

坑1:16*16的卷积实现的比较简单,在alexnet里面还是vgg就说过了更多更小尺寸的卷积核代替一个大的卷积核可以提取更好的特征并且计算量还更小,所以后续有文章研究用更多更小的卷积核来优化这个地方,也确实有效。
坑2:16 * 16步距16的卷积核相当于每个块之间没有重叠的,因此丢失了一部分图像的连续性特征。后续有很多文章就这一点设计方案,比如用加了padding以及小步距的卷积核让块和块之间有重叠,或者用shift window的方法让块与块之间信息交互。

2、class token部分

坑1:在CNN的结构中一般分类前都会用池化层来降维之后展平成1维度的特征进行分类,ViT这里额外拼接了一个分类的token,后续就有论文针对这一点将class token去掉了,用全局平均池化将9个token的特征计算降维后计算均值来进行分类。

3、position embedding部分

坑1:ViT的position embedding直接加上一个可学习的位置编码,让模型自己去学习位置信息,其实这里我是一直不理解的为什么在这个位置加上一个偏置,最后也没有监督信号,这个偏置就学会了位置信息…感觉很奇怪。所以这个地方后续论文提出了很多花里胡哨的位置编码的方法。

4、transformer encoder部分

坑1:ViT的transformer输入输出的特征尺度不变,但是在resnet中,他是每个layer输出了不同尺度的特征,因此也有了很多文章对这个输入输出尺度进行优化的。比如构建成一个金字塔的结构等。

5、作者自述

坑1:ViT需要现在JFT-300M大型数据集上预训练,然后在ImageNet-1K上训练才能得到出色的结果,这借助了额外的数据。

其他一些坑我再看看论文再补充补充

所以可以看到,ViT开山之后,每一个部分都被后来的学者进行了深入的探索,属实优秀,上一篇这样的文章应该还是resnet吧~

你可能感兴趣的:(Transformer,transformer,网络,深度学习)