Vision Transformer

Vision Transformer

将Transformer应用于CV领域。

不了解Transformer的先去看下:一文看懂Transformer

对比Transformer,ViT的特殊之处不多。因为作者说了他们想要做“尽量少的改动”将Transformer直接应用于图像领域

论文下载地址:https://arxiv.org/abs/2010.11929
github:https://github.com/google-research/vision_transformer
pytorch:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_classification/vision_transformer

网络结构图

在这里插入图片描述

patch embedding

一步一步来看,首先呢处理文本的时候我们将每一个单词转化为一个向量。那么处理图像的时候我们采用的办法是将一张图像划分为16x16大小的块Patch(也可以是8x8,也可以是32x32)。

假如输入图片大小为224x224,将图片划分为固定大小的patch,patch大小假设为16x16,则每张图像会生成(224/16)^2=196个patch,

分块之后对每一块进行展平,16x16x3展平之后就是768。所以整个输入的大小就是196x768。

然后就像我们处理单词一样,我们用一个线性投射层,大小为768xN(N=768)

所以经过线性层之后,大小仍然为196x768,尺寸没变

这里还需要加上一个特殊字符cls。

传统的Transformer采取的是类似seq2seq编解码的结构,而ViT只用到了Encoder编码器结构,缺少了解码的过程,假设你16个向量经过编码器之后,你该选择哪一个向量拿去做最后的分类呢?因此这里作者给了额外的一个用于分类的向量,与输入进行拼接。同样这是一个可学习的变量。作者认为,由于自注意力的机制 ,这个向量也会从其他向量里面学到有用的信息。

因为是直接拼接,所以尺寸就变为197x768

positional encoding

图片虽然划分了,但是也是有顺序的,所以我们也需要加入位置信息。

这里可以学习的变量来表示位置信息,大小为197x768,与输入尺寸一样,直接与输入的做加法,最终得到还是197x768。

用这个来学习位置信息。

Transformer Encoder

至此,我们将一张图片,处理为了197个token,每个token长度为768。就将图像问题转化为了nlp问题了,转化成了序列。

直接输入Transformer Encoder就行。

在这里插入图片描述

MLP:将维度放大再缩小回去,197x768放大为197x3072,再缩小变为197x768

堆叠多个Block,最后将特殊字符cls对应的输出 Z 0 Z_0 Z0最为Encoder最终的输出

(另一种做法是不加cls字符,对所有的tokens的输出做一个平均)

分类头

最后把输出,送进分类头就好了

分类头就是一个LN,加两个线性层。

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/128077579