场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读

  • 在NLP领域,基于注意力的Transformer模型使用的非常广泛,但是在计算机视觉领域,注意力更多是和CNN一起使用,或者是单纯将CNN的卷积替换成注意力,但是整体的CNN 架构没有发生改变
  • VIT说明,纯Transformer不使用CNN也可以在视觉领域表现很好,尤其是当我们在大规模数据集上做预训练,再去小数据集上做微调,可以获得跟最好的CNN相媲美的结果
  • 在NLP领域,BERT提出的方法已经成为主流:先在大规模的数据集上做预训练,再去小数据集上做微调,同时由于Transformer模型的高扩展性和高效性,现在的数据集和模型可以做的越来越大,同时还没有任何性能饱和的现象,因此VIT想将Transformer应用到计算机视觉中
    在这里插入图片描述
  • 但是Transformer有以下的问题:
    1. Transformer中最主要的操作是自注意力操作,而自注意力操作是需要所有元素都要和所有元素去交互,两两相互的,计算得到的Attention,再将这个Attention去做加权平均,最后得到输出,因此自注意力的计算复杂度为 O ( n 2 ) O(n^2) O(n2),但是目前硬件能支持的这个序列长度n为几百或者上千,在BERT中n为512
    2. 但是在计算机视觉领域,如果我们想把2D的图片变成1D的序列,那么最简单最直观的方法就是把图片中的所有像素点当成序列的元素,直接拉直并输入进Transformer,一般来说在视觉领域,输入图片的尺寸为224224、800800等,将它直接拉直送入Transformer,得到的序列长度直接过万,计算复杂度太高,硬件跟不上
  • 针对以上的问题,有如下的解决方案:
    1. Local Network:既然直接把像素点当作Transformer的输入太长,导致计算复杂度太高无法训练,那么我们把网络中间的特征图当作Transformer的输入,直接降低输入序列的长度,例如Res50的特征图只有14*14,这就是可以接受的范围之内了
    2. Stand-Alone Attention:孤立注意力,既然使用整张输入图片的复杂度太高,那么我们改为使用一个局部的小窗口,来缩小输入序列的长度。Axial Attention:轴注意力,将图片的宽高拆分为两个轴,因此225225的输入序列就变为了2225的输入序列,也降低了输入序列的长度。
    3. Sparse Attention:稀疏点注意力。Block Attention:将输入图片分块,进行注意力计算
  • 以上这些解决方案虽然在CV上的结果都不错,但是需要很复杂的工程来加速运算。
  • 虽然已经有人在视觉领域使用注意力,但是一个纯Transformer的CV模型还没有,而纯Transformer可以继承它在NLP的高扩展性,这就是VIT的想法
    在这里插入图片描述
  • VIT通过将图片分割为1616个块,来解决输入序列太长的问题,如果输入图片的尺寸为224224,那么分割后的每块的尺寸为1414(224/16 = 14),那么输入序列长度就变为1414,这个输入长度就是Transformer可接受的长度,这样在NLP中一个句子有多少个单词就转换为了在CV中一个图片有多少个patch。
  • 同时不同于BERT的自监督训练方式,在VIT中,采用了有监督的方式来进行训练。同时类似于BERT,也仅仅使用了Transformer Encoder作为模型
  • 在中等大小的数据集上进行训练(如ImageNet),如果不加强约束,VIT其实比同等大小的Resnet性能要弱。这主要是因为Transformer比CNN要缺少一些归纳偏置(先验知识):
    1. 局部性:由于卷积核是一步一步的在输入图片上进行移动卷积的,所以CNN假设图片上相邻的区域会有相似的特征
    2. 平移等变性:由于卷积核不考虑位置,所以在输入图片的不同的位置的相同物体,卷积核的输出是相同的,但是由于在Transformer中,加入了位置编码,所以不同位置的相同物体,Transformer Encoder的输出也不会相同
  • 在大型数据集上进行训练,VIT就可以获得跟最好的CNN一样的性能,甚至可以超过它们
  • VIT只是单纯的将输入图片做一个预处理,分割成16*16的块,然后送到Transformer中就可以了,其他什么改动都不需要,这样就可以把一个视觉问题理解成一个NLP问题,同时仅仅在分割图片和位置编码的时候,使用了图像特有的归纳偏置。因此不需要我们对CV领域有什么了解,直接把图片当成是一个序列的图像块,就跟一个句子有很多单词一样。然后就可以把NLP领域的标准Transformer来做图像分类,当把VIT加上大规模的数据集时,模型的性能表现出奇的好。
    在这里插入图片描述
  • VIT的模型设置是尽可能地按照最原始的Transformer的结构来设计,这样做的好处是可以直接把NLP中高效的模块部分,直接拿过来用
  • VIT的流程如下:
    1. 先将输入图片分块,假设输入图片为 3 * 224 * 224 的尺寸,分成尺寸为 16 * 16 的块,那么可以得到196个块,每个块拉直后的尺寸为 3 * 16 * 16 = 768,3为通道数
    2. 将拉直后的块X,输入进全连接层E,E的尺寸为 768 * 768,后一个768为D,代表模型的大小可以改变,前一个768是每个块拉直后的尺寸不能改变,那么:X · E 的尺寸为196 * 768
    3. 类似于BERT,需要加入一个特殊字符 [ CLS ] 作为最后的分类输出,并且[ CLS ] 的位置信息为0,因为所有的输入块都在跟所有的输入块做注意力计算,所以我们假设第一个块 [ CLS ] 可以学到其他块的有用信息,那么可以只根据 [ CLS ] 的输出来做最后的分类判断即可,[ CLS ] 的尺寸为 1 * 768,所以整体输入的尺寸为 197 * 768
    4. 整体的输入还需要加上位置编码(这里为1D的可学习位置编码,类似BERT),由于是直接加上位置编码,所以整体的输入尺寸仍然为 197 * 768,即Embedded Patches的尺寸为 197 * 768
    5. 整体的输入先进入Layer Norm层,再进入Multi-Head Attention层,由于采用了多头(这里是12),所以每个头的K、Q、V的尺寸为 197 * 64,最后将这些头的输出拼接起来,最后的尺寸又变成197 * 768,再经过Layer Norm层,和MLP层,注意MLP一般会将输入的尺寸先放大再缩小,如这里先放大四倍变为 197 * 3072 ,再缩小投射回 197 * 768,最后就输出了
    6. 同时由于这个Transformer Encoder Block的输入尺寸等于输出尺寸,都是 197 * 768。所以可以直接叠加Block
    7. 在VIT用作分类任务时,直接将经过很多Encoder Block层的 [ CLS ] 当作VIT模型的最后输出,即整个图片的特征,然后添加一个MLP的分类头来实现分类任务
  • 在CNN中,我们做分类任务,并不是类似于BERT的做法,使用 [ CLS ]来作为图片整体的特征进行输出,而是通过对特征图进行全局平均池化,得到一个拉直的向量,再通过这个向量来做分类。这里VIT由于想尽可能地接近Transformer,所以采用了BERT的方法,但是使用传统CNN的方法,效果差不多
  • 注意:由于我们是先将图像块的全部像素点拉直后,输入进全连接层,得到抽象后的特征,此时这个特征代表了整个图像块的内容,我们可以看作这个特征具有了这个图像块内部的位置信息,因此只需要给出图像块之间的位置编码即可,图像块内部的位置信息就不需要再额外指定了

位置编码

在这里插入图片描述

  • 1D位置编码:有两种1D位置编码,BERT采用可学习的,原始Transformer采用固定的。1D位置编码的维度和输入特征向量的维度相同
  • 2D位置编码:也有两种2D位置编码,可学习的,固定的。2D位置编码的维度分为两部分,假设输入特征向量的维度为D,那么前D/2和后D/2分别为横坐标和纵坐标的维度,将横坐标和纵坐标的维度拼接起来,就得到了维度为D的2D位置编码
  • 注意:以上这两种都是绝对位置编码。
  • 相对位置编码:如果是1D的情况,两个图像块之间的距离,可以用相对距离(间隔多少个图像块等方法)来表示。

VIT挖的坑

  1. 由于VIT是做图片分类,但是Transformer不能只用来做图片分类,还有分割和检测任务,所以VIT-FRCNN(检测)、SETR(分割)在同年12月出现了
  2. 由于VIT使用的是有监督的训练方式,但是在NLP中大的Transformer模型,如BERT,使用的是自监督的训练方式,那么VIT可不可以也使用自监督的训练方式呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/659959.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置(目录访问)

知识点 常用用途: 软件仓库镜像及提供下载服务: 配置步骤 删除网站主目录中的文件(本实验机目录为/home/source ip为192.168.12.137 端口为81) cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

情感类ppt素材

小清新手绘插画风毕业季毕业相册同学录画册纪念册PPT下载 - 觅知网这是一张关于清新毕业相册的PPT模板,清新风格设计,加上风为装饰元素,包含毕业相册、毕业季、毕业、同学、纪念等主题内容,也可用作毕业相册PPT、毕业季PPT、毕业P…

【酱浦菌-爬虫项目】爬取学术堂论文信息

1. 首先,代码定义了一个名为 url 的变量,它是一个包含三个网址的集合(或者说是一个集合的字典)。这些网址分别是: - ‘http://www.xueshut.com/lwtimu/127966.html’ - ‘http://www.xueshut.com/lwtimu/12…

JAVA前端快速入门基础_javascript入门(02)

写在前面:本文用于快速学会简易的JS,仅做扫盲和参考作用 1.JavaScript函数 什么是函数:执行特定任务的代码块 1.1定义: 使用function来进行定义(类似于python里面的def 或者java和c里面的void,int这些返回类型开头)。定义规则如下: func…

AI大模型探索之路-训练篇8:大语言模型Transformer库-预训练流程编码体验

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

【GAMES 101】图形学入门——着色(Shading)

定义:将不同材质内容应用于不同物体对象上的过程。着色只考虑着色点的存在,不考虑其他物体的遮挡等,因此不考虑阴影处理 一些前期内容的定义: 着色点(Shading Point)观测方向(Viewer Directio…

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景,一般常用的工具是使用Selenium,一套简单的UI自动化架构如下: 上图即为简单搭建的一套UI自动化测试架构,但 串行执行测试用例: 一台机器只能安装一个…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先,我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时,如果我们可以知道质数 x x x 在质数数组的下标 j j j,那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

自动化神器,获客秘籍揭秘!

在如今这个信息爆炸的时代,企业如何高效精准地获客成为了一个重要课题。传统的营销方式不仅成本高昂,且效果往往难以衡量。然而,随着自动化工具的兴起,这一切都在悄无声息中发生着翻天覆地的变化。 我们得了解一下什么是自动化工具…

FebHost:为什么短域名在数字世界这么重要?

寻找完美的短域名,就好比在节假日商场促销时争夺一个最佳停车位,它关乎的是如何进场、出场以及给人留下深刻印象。 那么,为什么短域名如此重要?又该如何为自己寻找合适的短域名呢?下面,我们来详细探讨一下…

2024年Docker常用操作快速查询手册

目录 一、Linux系统上 Docker安装流程(以ubuntu为例) 一、卸载所有冲突的软件包 二、设置Docker的apt存储库(这里使用的是阿里云软件源) 三、直接安装最新版本的Docker 三、安装指定版本的Docker 四、验证Docker是否安装成功…

redis主从+哨兵搭建

redis主从哨兵搭建 1. 工程准备2. 基于Dockerfile构建2.1 拷贝工程到工作目录2.2 安装依赖包2.3 解压redis安装包、编译、安装2.4 拷贝配置文件到安装目录 3. 配置文件3.1 redis-master.conf3.2 redis-slave.conf3.3 sentinel-master.conf3.4 sentinel-slave.conf 4. 启动redis…