CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇

news2024/11/27 11:54:23

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊往期回顾:CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了!

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

 

文章目录

  • CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇
    • 写在前面
    • VIT模型整体框架✨✨✨
    • VIT细节梳理✨✨✨
    • VIT模型参数
    • 实验结论
    • 小结
    • 参考连接

CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇

写在前面

​  在上一篇,我已经详细为大家介绍了NLP邻域中的Transformer,足足写了10000+字,酝酿了好多天才下笔,也写了很久,自认为写的还算是通俗全面。如若你对Transformer还没什么了解,建议你点击☞☞☞了解详情。

​  其实,作为CV程序猿的我们,学习NLP邻域的Transformer更像是被迫之举,毕竟现在基于Transformer的算法在CV邻域可谓是大杀特杀。那么今天我就为大家带来将Transformer引入到视觉物体分类中的一篇文章,标题为 AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE ,这篇文章发表于2021年,下载链接如下:download 📥📥📥

​  那么这篇文章将为大家详细讲解VIT的原理,下一篇将给大家带来VIT的代码实战。🌼🌼🌼

  准备好了嘛,滴滴滴,让我们坐上入门VIT旅途的观光车,一览VIT的风采。🚖🚖🚖

 

VIT模型整体框架✨✨✨

  我们先来看看VIT的整体框架,如下图所示:

image-20220812145556051

  从整体上来看,VIT模型的结构是很少的,事实上确实如此。如果你明白了我上一篇讲解的Transformer的话,那这篇文章真的就特别简单了,可以说没什么难点。这篇文章作者企图不改变Transformer的结构来实现物体分类任务,我们可以来看一下VIT中的Transformer Encoder 结构,基本是和Transformer中是一样的。注意我这里说的是基本喔,你对比两篇论文中Encoder的结构你会发现,Norm这个结构的位置是有所变化的,至于为什么这样做,作者也没有提及,个人感觉这个改变对结构影响不会很大,感兴趣的可以改变这个结构尝试尝试效果。另外一点是在VIT中没有使用Decoder结构,这里大家需要注意一下。

​  整体框架大家有个印象就好,肯定还有一些不清楚的地方。不用担心,后面我会详细的为大家讲述一些结构上的细节!!!🌴🌴🌴

 
 

VIT细节梳理✨✨✨

​  首先,我觉得大家有必要想想NLP中的Transformer和CV中的VIT这两个结构输入有什么区别?从变量的类型来看,两者都是一个tensor张量;而从变量的维度来看,NLP中的输入往往是二维的tensor,而CV中往往是一个三维的RGB图像。【都忽略了Batch维度】 这种维度的不统一会导致我们不能直接将图片数据喂入到Transformer结构中去,而是需要进行一定的维度转换,即将三维的tensor转换成二维的tensor,这个过程被称为patch_embedding。

​  那论文中是如何将三维的tensor转化为二维的tensor的呢?如下图所示:

image-20220812165754427

​  可以看到,上图将一张RGB图片分成了9个相同大小的小块。假设原图尺寸为 H × W × C H×W×C H×W×C, 每个块的大小为 m × n × C m×n×C m×n×C ,对于上图我们一共分成了9块,应有 H m = 3 \frac{H}{m} = 3 mH=3 W n = 3 \frac{W}{n} = 3 nW=3。不知道大家发现没有,其实就进行这样的一个操作我们就已经把三维的tensor转化为二维的tensor了,即由原图的 $H×W×C \to \ $ 9 × ( m × n × C ) 9×(m×n×C) 9×(m×n×C)【注:此时每个小块的图片尺寸都是 m × n × C m×n×C m×n×C,我们将其展平其实就是一个维度】

​  上文为大家介绍了三维tensor到二维tensor的转换,理论上很简单,代码其实就更简单了,就只需要调用一个函数即可,具体什么函数不知道的大家可以参考这篇文章。

​  我这里没有讲这个函数是因为我参考的代码并不是这样做维度变换的,而是通过卷积的方式进行。听上去是不是很奇妙呢,下面就跟我一起来看看吧。为方便大家理解,这里我们拿具体的数字来举例。设原图的尺寸为224*224*3,每个块(patch)的尺寸为 16 ∗ 16 ∗ 3 16*16*3 16163,则我们一共会得到 224 16 ∗ 224 16 = 14 ∗ 14 = 196 \frac {224}{16}*\frac {224}{16} =14*14=196 1622416224=1414=196个patchs, 所以经分块后,一个224*224*3的三维tensor会变成一个196*(16*16*3),即196*768的二维张量。那么由224*224*3变换到196*768的这个过程是可以由卷积实现的,即我们对原图进行卷积,卷积核大小为16*16*3 ,步长为16,padding=0,卷积核个数为768,卷积后,我们会得到特征图,其尺寸为14*14*768,接着将前两个维度展平,就得到了维度为196*798的tensor。其大致过程如下:

​  我认为这步使用卷积真的很巧妙,我们得到的196*798的二维向量,其实每一行即1*798都包含了原图中16*16*3大小的patch,这就是卷积的提取特征的功能嘛。【我这样介绍不知道大家会不会有这样的思路——我先用一些CNN模型来对图片提取特征,只要使CNN最后的输出维度为196*768,最后在送入Transformer模型中。其实这就将CNN和Transformer很好的结合在一起了,这种方法是可行的,大家可以自己尝试尝试喔】


​  现在我们已经得到了196*768维的tensor,我们假设其为x。接下来我们会使用一个维度为1*768维的Class token来和x进行Concat操作,输出结果为197*768维的tensor。这里肯定有人有疑问了,为什么这里会加一个Class token,在上篇讲述的Transformer中可没有这个操作。–小傻瓜–因为这篇文章我们要用来对物体进行分类啊!!!说不定你现在有点怀疑自己了,因为是分类任务所以要加上Class token?这两个还有因果关系不成?一个个问号从你脑海中冒出,百思不得其解。其实啊,这可没什么啥因果关系,只是我们在分类任务中加上Class token可能会效果更好。🌵🌵🌵

​  与其介绍为什么加上Class token会效果更好,不如我们先来看看不加Class token会产生什么效果。如果我们不加Class token,直接将196*768维的tensor输入Encode中,我们的输出同样是196*768,即196个1*768维的向量,这时候我们应该拿哪个向量来当作最后的输出向量进而进行物体分类任务呢?这我们是很难确定的。所以我们干脆在输入Encode前就加上一个1*768维的向量(这个1维向量放在196*768维向量前面),这样在输出时向量的维度就会是197*768,然后我们只需要通过切片的方式获得第一个1*768维向量并将其送入分类头进行分类即可。在代码中这个Class token是一个可学习的向量,初始为全0的1*768维向量。🌱🌱🌱


​  Class token和x拼接后,输出尺寸变成了197*768,此时我们会加上一个位置编码向量position Embedding,其维度为197*768。关于这部分我在上一篇介绍Transformer中已经很详细的介绍过了,这里不再过多阐述原理。但我们可以看一下如果我们不使用位置编码,那么下面两幅图输出的结果将是一致的,这显然是有违我们直觉的。

image-20220813102024706

图片来源于yutubu Shusen Wang老师

​  需要注意的是,在上一篇我们采用的是正弦位置编码的方式,而这里我们将位置编码向量设置为一个可学习的向量,初始为全0的197*768维向量。至于这两种编码方式哪个好我也没有做过实验,感兴趣的可以查查资料,做做实验,个人感觉使用可学习的位置编码效果应该不会差!🌲🌲🌲


​  接下来我们将经过位置编码的输入喂入encoder网络中,并重复L次encoder结构,encoder的结构如下:

image-20220813102434358

  这部分我也不再细讲了,不明白的可以看我上一篇关于Transformer中Encoder的讲解。经过L个encoder结构后,输入维度没有发生变换,仍为197*768维。【到这里大家可能就发现了VIT模型很多结构都和Transformer很类似,所以大家搞懂了Transformer再来看这篇文章真的就很简单了】


​  经过encoder结构后,输出的维度维197*768,此时我们会通过切片的方式提取出Class token的信息,其维度为1*768。接着会拿这个1*768维的Class token经过MLP Head层。MLP Head层的结构如下:

image-20220813105327592

​  其中Pre-Logits这部分是可选的,其就是一个全连接层加上一个tanh激活函数,具体我们会在下一篇代码实战部分进行讲解。Linear就用于分类了,输出节点个数为我们任务的类别数。


  这样,我们VIT的整个流程就都学完了,是不是发现还蛮简单的呢。最后,我找到了一张整个过程的动态图,大家可以参考:【图片来源于此篇博客】

在这里插入图片描述


 
 

VIT模型参数

​  在论文中给出了三个模型(Base Large Huge)的参数,如下:

ModelPatch sizeLayersHidden SizeMLP sizeHeadsParams
VIT-Base16*161276830721286M
VIT-Large16*16241024409616307M
VIT-Huge14*14321280512016632M

  这里对上表中某些参数做个简要的介绍。Patch size为将一张图片分成小块每小块的尺寸,在我们的代码中其实就是卷积核的尺寸。Layers表示encoder结构重复的次数。Hidden Size为通过输入encoder前每个token的维度,在我们上文举的例子中为768,在下篇代码中其实就是卷积核的个数。MLP size是在encoder结构中的MLP Block中第一个全连接层的节点个数,这个我们再代码部分细讲。Heads表示Multi-Head Attention的Heads数目。params表示模型所用参数大小。

 
 

实验结论

​  这部分论文中还是放了好几张图的,这里我就介绍一张比较关键的,如下图所示:

img

  这幅图展示了什么呢——作者本别在ImageNet、ImageNet-21k和JFT-300M这三个数据集上做实验。【注:这三个数据集数据量越来越大】

​  我们发现,当在小数据集ImageNet上做预训练时,VIT的模型架构效果普遍低于BiT【注:BiT是用ResNet搭建的结构】;当在中等数据集ImageNet-21k上做预训练时,VIT的模型架构基本位于BiT最好和最差的之间;而当在大数据集JFT-300M上做预训练时,VIT的模型架构最好的效果已经超过了BiT。

  这个实验告诉我们什么呢?——VIT模型需要在大数据集上进行预训练,在大数据集上预训练的效果会比卷积神经网络的上限高!

 
 

小结

  VIT的原理就为大家介绍到这里啦,是不是发现还是很简单的呢。🍅🍅🍅如果你还有一些细节没用理解,不用担心,在下一篇我将为大家介绍VIT的源码部分,相信届时大家能有更深的感悟。少年,一起加油吧!!!🌼🌼🌼

 
 

参考连接

Vision Transformer详解 🍁🍁🍁

Vision Transformer 超详细解读 (原理分析+代码解读) (二)🍁🍁🍁

Vision Transformer(vit)网络详解🍁🍁🍁

Vision Transformer (ViT) 用于图片分类🍁🍁🍁

 
 
如若文章对你有所帮助,那就🛴🛴🛴

在这里插入图片描述

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

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

相关文章

Linux centos7.6 安装elasticsearch8.x (es8) 教程

系列-Linux centos7.6 安装elasticsearch8.x (es8) 教程 Linux centos7.6 安装elasticsearch8.x (es8) 教程_言之有李LAX的博客-CSDN博客 系列-linux安装elasticsearch-head (es可视化界面) linux安装elasticsearch-head (es可视化界面&am…

隆重推出 Incredibuild 10

变更可能来的很快,也可能来的很慢。但有时候,它真的值得我们等待。您并非每天都能目睹一个很棒的平台进一步发展成为一个不可思议(Incredible)的平台。今天,我们将正式发布最新版本——Incredibuild 10!经过…

SIMetrix导入MOS管参数的另一种方法

问题的提出 在采用SIMetrix 8.3软件进行E类放大器的仿真过程中,用到了NEXPERIA公司的NMOS管器件PMH550UNE, 但在SIMetrix 8.3的库中没有该器件,因此需要导入第三方库文件. 通常的办法是从生产该器件的公司网站上下载器件库文件,导入到SIMet…

《QDebug 2022年11月》

一、Qt Widgets 问题交流 二、Qt Quick 问题交流 1.QtQuick.Dialogs 1.x 中的 MessageDialog 触发两次 accepted 、rejected [QTBUG-94126] If inherit QApplication, the MessageDialog accepted signal is emitted twice. - Qt Bug Tracker 当使用 QApplication 而不是 Q…

React 中ref 的使用(类组件和函数组件)以及forwardRef 与 useImperativeHandle 详解

前言 在一个父组件中,我们想要获取到其中的节点元素或者子组件实例,从而直接调用其上面的方法。Class 类组件和函数组件是两种不同的写法。 1. Class 组件中使用ref 在 React 的 Class 组件中,我们通过 createRef 创建 ref class Parent …

传统制造企业进行数字化转型,是翻身还是翻船?

数实融合正在从可选项,变成每个行业都要面对的必选项,制造企业也从野蛮生长逐渐步入有序的数字化世界。 出品|产业家 2022年,疫情及经济环境全面淬炼了各行各业,大多数能有效应用数字化持续经营的企业成为幸存者,数字…

信号与进程间通信

目录结束进程结束后台进程结束前台进程信号基本概念接收信号发送信号代码演示接收信号函数(signal)SIG_IGNSIG_DFL自定义函数发送信号(kill)接收信号解决僵尸进程结束进程 结束后台进程 终端1:./main killed 终端2&a…

Linux系统编程(五)——Linux下的多线程

目录 0x01 线程概述 一、线程和进程的区别 二、线程和进程的虚拟地址空间 三、线程之间共享的非共享资源 四、NPTL 0x02 创建线程 0x03 终止线程 0x04 连接已终止的进程 0x05 线程的分离 0x06 线程取消 0x07 线程属性 0x08 线程同步 一、互斥锁 二、死锁 三、如何…

三肽Gly-Cys-Gly、88440-55-5

三肽Gly-Cys-Gly 编号:111774 CAS号:88440-55-5 三字母:H2N-Gly-Cys-Gly-COOH 描 述:羧肽酶 U 抑制剂(凝血酶可激活的纤维蛋白溶解抑制剂,TAFI),Ki 0.14 μM。编号: 111774 中文名称…

Java#29(集合进阶2---双列集合)

目录 一.Map------------双列集合-----------一次添加一对元素,如: 小明 99岁 1.特点: 2.Map中常见的API 3.Map集合的遍历方式 4.HashMap 5.LinkedHashMap 6.TreeMap 一.Map------------双列集合-----------一次添加一对元素,如: 小明 99岁 1.特点: (1)双列集合一次需要…

在嵌入式里面实现printf()类似的功能

学习C语言大多数都是从printf("hello world")开始的,对于printf的熟悉程度最高,在嵌入式编程中,实现printf函数有一种很标准的办法就是实现putch,绑定对应的串口输出,设置好波特率,使能串口就可以…

No module named ‘PyQt5.QtWebEngineWidgets‘kn-----已解决

1.情况说明 本人在学习PyQt5的时候遇到了 from PyQt5.QtWebEngineWidgets import * 报错的情况,原因就是ModuleNotFoundError: No module named PyQt5.QtWebEngineWidgets 没有PyQt5.QtWebEngineWidgets, 2.解决办法: 解决办法一&#xf…

最快最便捷的pytest使用allure测试报告

一、前言 最近通过群友了解到了allure这个报告,开始还不以为然,但还是逃不过真香定律。 经过试用之后,发现这个报告真的很好,很适合自动化测试结果的展示。下面说说我的探索历程吧。 选用的项目为Selenium自动化测试Pytest框架…

Day1使用Burpsuite抓包工具抓包,改变UA头使得手机和pc端界面互相转换

1.前期工作:安装Burpsuite工具这里网上有许多教程,大致步骤如下: 找到安装包然后解压缩,然后双击 安装jdk,然后就是配置环境变量,如果是默认jdk安装路径没有更改路径的话就是跟如下一样 配置如下&#xff…

跨平台开发方案的三个时代

跨平台开发从本质上讲是为了增加业务代码的复用率,减少因为要适配多个平台带来的工作量,从而降低开发成本。在提高业务专注度的同时,能够为用户提供一致的用户体验,实现“多快好省”的效果。 跨平台是跨哪些平台?怎么…

高视医疗在港交所招股:IPO募资要用于贷款,高铁塔为控股股东

11月30日,高视医疗(HK:02407)在港交所发布公告,拟全球发售1306.86万股股份,其中香港发售股份130.7万股,国际发售股份1176.16万股,另有15%超额配股权,于2022年11月30日至12月5日招股&…

Talk预告 | 亚马逊云科技上海人工智能研究院肖天骏:基于视频的自监督物体遮挡补全分割

本期为TechBeat人工智能社区第458期线上Talk! 北京时间11月30日(周三)20:00,亚马逊云科技上海人工智能研究院资深应用科学家——肖天骏的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “基于视频的自监督物体遮挡补全分割”…

请求和响应

目录1 请求对象1.1 请求对象介绍1.2 请求对象常用方法-获取各自路径1.3 请求对象常用方法-获取请求头信息1.4 请求对象常用方法-请求参数信息1.5 获取请求参数并封装对象1.5.1 手动封装方式1.5.2 反射封装方式1.5.3 工具类封装方式1.6 流对象获取请求信息1.7 中文乱码问题1.8 请…

可发生点击化学反应:1458576-00-5,Biotin-PEG4-alkyne,生物素-四聚乙二醇-炔

【中文名称】生物素-四聚乙二醇-炔,生物素-四聚乙二醇-丙炔基 【英文名称】 Biotin-PEG4-alkyne 【货号】Y-PE-2172 【CAS】1458576-00-5 【分子式】C21H35N3O6S 【分子量】457.58 【基团】alkyne 【纯度】95% 【规格】25mg,100mg,250mg 【是…

如何应对继承的双面性

如何应对继承的双面性 继承既强大又有破坏性,那怎么办呢? 1)避免使用继承; 2)正确使用继承。 我们先来看怎么避免继承,有三种方法: 使用final关键字; 优先使用组合而非继承&#…