• 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,加两个线性层。

  • 相关阅读:
    80. 删除有序数组中的重复项 II
    Kubernetes学习记录之Pod
    【数据库】达梦数据库DM8开发版安装
    质量、重力和重量
    不懂物理的前端不是好的游戏开发者(二)—— 物理引擎的学习之路
    Python和Java有什么区别
    Abnova丨E (DIII) (WNV) 重组蛋白 中英文说明书
    嵌入式系统,内存不够了该怎么办?
    14:STM32-----看门狗
    Mqtt是什么
  • 原文地址:https://blog.csdn.net/holly_Z_P_F/article/details/128077579