【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

news2024/11/15 22:22:07

文章目录

  • 一、简介
  • 二、Vision Transformer如何工作
  • 三、ViT模型架构
  • 四、ViT工作原理解析
    • 4.1 步骤1:将图片转换成patches序列
    • 4.2 步骤2:将patches铺平
    • 4.3 步骤3:添加Position embedding
    • 4.4 步骤4:添加class token
    • 4.5 步骤5:输入Transformer Encoder
    • 4.6 步骤6:分类
  • 五、总结

一、简介

Visual Transformer (ViT) 出自于论文《AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》,是基于Transformer的模型在视觉领域的开篇之作。

在这里插入图片描述

本文将尽可能简洁地介绍一下ViT模型的整体架构以及基本原理。

ViT模型是基于Transformer Encoder模型的,在这里假设读者已经了解Transformer的基本知识。

二、Vision Transformer如何工作

我们知道Transformer模型最开始是用于自然语言处理(NLP)领域的,NLP主要处理的是文本、句子、段落等,即序列数据。但是视觉领域处理的是图像数据,因此将Transformer模型应用到图像数据上面临着诸多挑战,理由如下:

  1. 与单词、句子、段落等文本数据不同,图像中包含更多的信息,并且是以像素值的形式呈现。
  2. 如果按照处理文本的方式来处理图像,即逐像素处理的话,即使是目前的硬件条件也很难。
  3. Transformer缺少CNNs的归纳偏差,比如平移不变性和局部受限感受野。
  4. CNNs是通过相似的卷积操作来提取特征,随着模型层数的加深,感受野也会逐步增加。但是由于Transformer的本质,其在计算量上会比CNNs更大。
  5. Transformer无法直接用于处理基于网格的数据,比如图像数据。

为了解决上述问题,Google的研究团队提出了ViT模型,它的本质其实也很简单,既然Transformer只能处理序列数据,那么我们就把图像数据转换成序列数据就可以了呗。下面来看下ViT是如何做的。

三、ViT模型架构

我们先结合下面的动图来粗略地分析一下ViT的工作流程,如下:

  1. 将一张图片分成patches;
  2. 将patches铺平;
  3. 将铺平后的patches的线性映射到更低维的空间;
  4. 添加位置embedding编码信息;
  5. 将图像序列数据送入标准Transformer encoder中去;
  6. 在较大的数据集上预训练;
  7. 在下游数据集上微调用于图像分类。

四、ViT工作原理解析

我们将上图展示的过程近一步分解为6步,接下来一步一步地来解析它的原理。如下图:

在这里插入图片描述

4.1 步骤1:将图片转换成patches序列

这一步很关键,为了让Transformer能够处理图像数据,第一步必须先将图像数据转换成序列数据,但是怎么做呢?假如我们有一张图片: x ∈ R H × W × C x \in R^{H \times W \times C} xRH×W×C,patch 大小为 p p p,那么我们可以创建 N N N个图像 patches,可以表示为 x p ∈ R ( p 2 C ) x_p \in R^{(p^2C)} xpR(p2C),其中 N = H W P 2 N = \frac{HW}{P^2} N=P2HW N N N就是序列的长度,类似一个句子中单词的个数。在上面的图中,可以看到图片被分为了9个patches。

4.2 步骤2:将patches铺平

在原论文中,作者选用的 patches 大小为16,那么一个 patch 的 shape 为(3, 16, 16),维度为3,将它铺平之后大小为3x16x16=768。即一个 patch 变为长度为 768 的向量。

不过这看起来还是有点大,此时可以使用加一个 Linear transformation,即添加一个线性映射层,将 patch 的维度映射到我们指定的 embedding 的维度,这样就和NLP中的词向量类似了。

4.3 步骤3:添加Position embedding

与 CNNs 不同,此时模型并不知道序列数据中的 patches 的位置信息。所以这些 patches 必须先追加一个位置信息,也就是图中的带数字的向量。

实验表明,不同的位置编码 embedding 对最终的结果影响不大,在 Transformer 原论文中使用的是固定位置编码,在 ViT 中使用的可学习的位置 embedding 向量,将它们加到对应的输出 patch embeddings 上。

4.4 步骤4:添加class token

在输入到Transformer Encoder之前,还需要添加一个特殊的 class token,这一点主要是借鉴了 BERT 模型。

添加这个 class token 的目的是因为,ViT 模型将这个 class token 在 Transformer Encoder 的输出当做是模型对输入图片的编码特征,用于后续输入 MLP 模块中与图片 label 进行 loss 计算。

4.5 步骤5:输入Transformer Encoder

将 patch embedding 和 class token 拼接起来输入标准的Transformer Encoder中。

4.6 步骤6:分类

注意 Transformer Encoder 的输出其实也是一个序列,但是在 ViT 模型中只使用了 class token 的输出,将其送入 MLP 模块中,去输出最终的分类结果。

五、总结

ViT的整体思想还是比较简单,主要是将图片分类问题转换成了序列问题。即将图片patch转换成 token,以便使用 Transformer 来处理。

听起来很简单,但是 ViT 需要在海量数据集上预训练,然后在下游数据集上进行微调才能取得较好的效果,否则效果不如 ResNet50 等基于 CNN 的模型。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的 空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像 这两种方法均属于图像增强。 灰度变换 邻域基本增强变换定义数学表达三种基本…

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法(非常详细) QTableWidget表格控件的用法(非常详细)QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5.清空6.运…

LED灯内常见驱动电路

如今LED灯已成为照明的主流,使用白炽灯的家庭少之又少。其主要优势是LED灯更节能,相同光效的情况下,LED灯消耗的电能要比白炽灯减少70%以上。 LED灯的寿命比白炽灯要长,使用过白炽灯的人都知道,使用不了多长时间&…

简析Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等

首先得搞清楚,不同锁的作用对象不同。 下面分别是作用于临界区、CPU、内存、cache 的各种锁的归纳: 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU,那就都是针对多核处理器或多CPU处理器。单核的话,只有发生中断会使…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时,了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此,我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具,支…

day01刷题记录

刷题 题目一分析题解 题目二分析题解 题目一 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是…

access数据库连接sqlserver实现远程连接

由于项目需要对接生产系统,但是生产系统使用的是access数据库(这么老还在用,不知道咋想的),客户又想把项目部署到阿里云上,需要阿里云远程连接本地的access数据库(心里一句MMP送上)&…

Java——线程池详细讲解

文章目录 一、线程池一、线程池基础1.1 什么是线程池1.2 为什么使用线程池1.3 线程池有哪些优势1.4 应用场景 二、线程池使用2.1 Java内置线程池 ThreadPoolExecutor2.1.1 线程池的七个参数2.1.1.1 **int corePoolSize 核心线程数量**2.1.1.2 int maximumPoolSize 最大线程数2.…

假期后,野兔百科系统网站源码新版更新发布

这个是野兔百科系统中文版更新,这次更新了增加几个功能模块,几个已知的问题,修复系统部分功能。 系统名称:野兔百科系统 系统语言:中文版 系统源码:不加密,开源 系统开发:PHPMySQL …

尚融宝29-提现和还款

目录 一、提现 (一)需求 (二)前端 (三)后端 1、提现接口 2、回调接口 二、还款 (一)需求 (二)前端 (三)后端 1、还款接口 …

第一章:概述

1,因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因此,互联网是“网络的网络…

UE蓝图基础学习笔记(未完待续2023/05/03)

文章目录 一、项目创建1)准备流程(选择模板、开发语言、平台、质量等)2)界面介绍 二、Actor三、操作关卡对象(旋转、移动、缩放和坐标轴)四、常用快捷键五、运行游戏六、蓝图介绍七、蓝图节点八、操作事件图…

Azure DevOps Server 2022.0.1升级手册

Contents 1. 概述2. 操作方法 2.1 安装操作系统2.2 安装数据库2.4 还原数据2.3 安装和配置Azure DevOps Server 1. 概述 Azure DevOps Server 是微软公司经过20多年的持续开发,逐渐将需求管理、敏捷实践、源代码管理、持续集成等功能集成一体,实现应用软…

AutoHotKey简单入门

简单入门 快捷键 ^j::Send, Hello world! Return^j::代表CtrlJ,其中^代表Ctrl键 Send命令:在光标处输入Hello world! 也就是说,你按下CtrlJ后,将会输入字符串Hello world! Return即返回 热字串 ::ftw::Free the whales Ret…

抖音营销策略:新手如何利用抖音提高品牌曝光度

随着短规频平台的兴起,抖音作为其中的校佼者,已经成为了众多用户和企业的营销利器。但是,对于抖音新手而言,如何在这个平台上快速提升影响力呢?下面不若与众就为大家分享几个实用的方法。 一、关注抖音热门话题和潮流 抖音平台上…

力扣题库刷题笔记581-最短无序连续子数组

1、题目如下: 2、题解代码实现: 浅看题解,解题思路和本人接替思路一毛一样,奈何没有想到用双指针,在代码实现上也存在问题。当知道用双指针的时候,本题也变得相对简单。思路如下: a、输入仅存在…

Vue条件渲染v-if和v-show

条件渲染v-if和v-show <div id"root"><!-- <div v-if"true">v-if</div>--> <!-- <div v-show"true">v-show</div>--> n:{{n}}<button click"n">点击n</button><div v…

法规标准-UN R152标准解读

UN R152是做什么的&#xff1f; UN R152 全名为关于M1和N1型机动车高级紧急制动系统&#xff08;AEBS&#xff09;型式认证的统一规定&#xff0c;是联合国对于M1和N1型车辆AEBS系统认证的要求说明&#xff0c;当满足其要求内容时&#xff0c;才可通过联合国的认证&#xff0c…

数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践

面向数字化转型的大数据顶层设计实践 课程背景&#xff1a; 数字化背景下&#xff0c;很多企业存在以下问题&#xff1a; 不清楚大数据思维如何建立&#xff1f; 不清楚企业大数据分析方法&#xff1f; 不了解大数据应用成功案例&#xff1f; 课程特色&#xff1a; …

(转载)01.Matplotlib 图像结构-figure()axes设置

​概要&#xff1a;介绍matplotlib 绘制图像起手&#xff0c; figure() 的设置&#xff0c; axes() 的设置。主要的内容可移步最后部分的总结。 04 Matplotlib 总结 Matplotlib 提供了matplotlib.figure图形类模块&#xff0c;它包含了创建图形对象的方法。通过调用 pyplot 模…