ViT模型架构和CNN区别

目录

Vision Transformer如何工作

ViT模型架构

ViT工作原理解析

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

步骤2:将patches铺平

步骤3:添加Position embedding

步骤4:添加class token

步骤5:输入Transformer Encoder

步骤6:分类

总结

Vision Transformer(VIT)与卷积神经网络(CNN)相比

数据效率和泛化能力:

可解释性和可调节性:


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步,接下来一步一步地来解析它的原理。如下图:

在这里插入图片描述

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

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

步骤2:将patches铺平

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

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

步骤3:添加Position embedding

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

实验表明,不同的位置编码 embedding 对最终的结果影响不大,在 Transformer 原论文中使用的是固定位置编码,在 ViT 中使用的可学习的位置 embedding 向量,将它们加到对应的输出 patch embeddings 上。文章来源地址https://www.yii666.com/blog/433888.html

步骤4:添加class token

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

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

步骤5:输入Transformer Encoder

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

步骤6:分类

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

总结

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

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

 


Vision Transformer(VIT)与卷积神经网络(CNN)相比

在某些情况下可以表现出更强的性能,这是由于以下几个原因:

全局视野和长距离依赖:ViT引入了Transform模型的注意力机制,可以对整个图像的全局信息进行建模。相比之下,CNN在处理图像时使用局部感受野,只能捕捉图像的局部特征。

ViT通过自注意力层可以建立全局关系,并学习图像中不同区域之间的长距离依赖关系,从而更好地理解图像的结构和语义
可学习的位置编码:ViT通过对输入图像块进行位置编码,将位置信息引入模型中。这使得ViT可以处理不同位置的图像块,并学习它们之间的位置关系,

相比之下,CNN在卷积和池化过程中会导致空间信息的丢失,对位置不敏感


数据效率和泛化能力:

ViT在大规模数据集上展现出出色的泛化能力。由于ViT基于Transform模型,它可以从大量的数据中学习到更丰富、更复杂的图像特征表示。

相比之下,CNN在小样本数据集上可能需要更多的数据和调优才能取得好的结果。


可解释性和可调节性:

ViT的自注意机制使其在解释模型预测和注意力权重时具有优势。

相比之下,CNN的特征表示通常较难解释,因为它们是通过卷积和池化操作获得的。

 

 

 

 

 

 

 

 

 

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

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

相关文章

【Rust】Rust学习 第十五章智能指针

指针 (pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用(reference)。引用以 & 符号为标志并借用…

C# Linq源码分析之Take (三)

概要 本文在前两篇Take源码分析的基础上,着重分析Range参数中有倒数的情况,即分析TakeRangeFromEndIterator的源码实现。 源码及分析 TakeRangeFromEndIterator方法用于处理Range中的开始和结束索引存在倒数的情况。该方法位于Take.cs文件中。通过yie…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 在本系列中&#xff0c;我们将构建一个 NodeJS 微服务&#xff0c;并使用…

派森 #P121. 序列统计

描述 将用户输入的多个数值&#xff08;以输入为空结束&#xff09;存放至列表中&#xff0c;并完成以下统计计算&#xff1a; 1、计算所有数的最大值&#xff0c;最小值&#xff0c;平均值&#xff1b; 2、计算中位数&#xff0c;中位数&#xff1a;在一个有序数列中位于中件…

qt初入门0:结构体中QString用memset导致崩溃分析及QLatin1String简单查看源码

初识Qt,进行开发时遇到一个崩溃问题 简单整理 1&#xff1a;问题描述如下&#xff0c;结构体中QString成员&#xff0c;然后对结构体调用了memset导致问题&#xff1a; 2&#xff1a;问题分析&#xff0c;加断点调试的方式可以明确分析到行数 可以明确看出&#xff0c;初始化…

Windows下问题定位

1、内存相关知识点&#xff1b; 1&#xff09;windows下32位进程&#xff0c;用户态为2G内存&#xff0c;内核态也为2G内存&#xff1b;却别于linux操作系统&#xff1b; 备注&#xff1a;可以通过命令行与管理员权限&#xff0c;启动3G的用户态空间&#xff0c;但是部…

Java 下载压缩zip

Java压缩zip /*** 下载压缩包** param instId 实例id* param response 响应* author 梁伟浩* date 2023-08-21*/GetMapping("/downloadZip")ApiOperation(value "下载压缩包")ApiImplicitParam(name "instId", value "实例id", r…

git权限问题解决方法Access denied fatal: Authentication failed

文章目录 遇到Access denied 的权限问题解决方法1、git的密码修改过&#xff0c;但是本地没更新。2、确定问题&#xff0c;然后增加配置① 查询用户信息②如果名称和email不对&#xff0c;设置名称&#xff1a;③ 检查ssh-add是否链接正常④ 设置不要每次都输入用户名密码 3、配…

6.小程序api分类

事件监听 以on开头&#xff0c;监听某个事件触发&#xff0c;例如&#xff1a;wx.WindowResize事件 同步 以Sync结尾的是同步&#xff0c;可以通过函数返回值直接获取&#xff0c;例如&#xff1a;wx.setStorageSync 异步 需要通过函数接收调用结果&#xff0c;例如&#…

mysql 数据类型

目录 数值类型 整数 tinyint 位类型 BIT(M) 浮点类型 float [(M, D)] [UNSIGNED] DECIMAL(M, D) [UNSIGNED] 二进制类型 字符型 CHAR(SIZE) VARCHAR(SIZE) 日期类型 DATE/DATETIME/TIMESTAMP string 类型 SET & ENUM 在前面的文章中&#xff0c;有时候茶树数…

【校招VIP】CSS校招考点之选择器优先级

考点介绍&#xff1a; 选择器是CSS的基础&#xff0c;也是校招中的高频考点&#xff0c;特别是复合选择器的执行优先级&#xff0c;同时也是实战中样式不生效的跟踪依据。 因为选择器的种类较多&#xff0c;很难直接记忆&#xff0c;可以考虑选择一个相对值&#xff0c;比如id类…

人大进仓数据库ksql命令基础

测试环境信息: 系统为银河麒麟V10 数据库为Kingbase ES V8 数据库安装目录为/opt/Kingbase/ES/V8 ksql命令位于/opt/Kingbase/ES/V8/Server/bin下 使用--help获取帮助 续上图 1.查看数据库列表 ./ksql -U system -l 2.查看数据库版本 ./ksql -V 3.连接指定的数据库tes…

如何写一个简单的dockerfile

Dockerfile 是一种文本文档&#xff0c;它包含了一组用户可以调用以创建镜像的指令。用户可以使用 docker build 命令&#xff0c;根据 Dockerfile 中定义的步骤&#xff0c;自动构建出一个新的 Docker 镜像。 以下是一些常用的 Dockerfile 指令&#xff1a; FROM&#xff1a…

python 条件编译如何写

在Python中&#xff0c;条件编译通常是通过预处理指令来实现的。与其他编程语言不同&#xff0c;Python没有像C或C那样的预处理器&#xff0c;但您可以使用一些技巧来模拟条件编译的效果。以下是一种在Python中模拟条件编译的常见方法&#xff1a; # 定义一个条件变量&#xf…

springboot使用mybatis配置多数据源

概述 配置多数据源有两种方案。一种是使用dynamic依赖的DS注解的方法&#xff0c;这种是比较简单方便的方法。另一种是本文介绍的方式&#xff0c;配置不同数据源的SqlSessionFactory 。 第二种方法是我在开发一个老项目时&#xff0c;老项目配置的方法。 application.xml s…

投资人热捧的创业大赛,有哪些AI原生应用值得关注?

“绝对远超全球同类产品”&#xff0c;一位大模型创业者对百度文心一言的表现不吝夸奖。 这是一家生产效率工具创业公司的负责人&#xff0c;今年5月百度发起大模型领域创业比赛——“文心杯”&#xff0c;他率先报名参赛并入选决赛文心创业营&#xff0c;目前与其他30多家入围…

【GAMES202】Real-Time Shadows2—实时阴影2

一、PCSS回顾 上一篇我们说了如何用PCSS是实现软阴影&#xff0c;这个过程是没有任何问题的&#xff0c;但是有一个速度的问题&#xff0c;因为PCSS涉及到非常多次对纹理特定某一块区域遍历的操作&#xff08;工业界一般都是用在该区域采样的方式&#xff0c;会因此产生噪声&am…

常见gis几何格式(wkt、geojson、arcgis json)的转换方法

1.相关链接 https://github.com/terraformer-js/terraformer 2.arcgis geometry json与geojson互转 Convert ArcGIS JSON geometries to GeoJSON geometries and vice versa. npm install terraformer/arcgis &#xff08;1&#xff09;arcgis geometry json转换成geojson格…

Zookeeper集群单节点启动成功但未同步其他节点数据

首先排查节点启动是否正常&#xff1a; 在zookeeper的bin目录下执行&#xff1a;sh zkServer.sh status 判断当前节点数据leader 还是follower 节点都启动正常&#xff0c;但某一个zookeeper集群节点&#xff08;下面简称“异常节点”&#xff09;不同步其他节点数据&#xf…