位置: IT常识 - 正文

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

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

推荐整理分享CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

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

🍊往期回顾: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的整体框架,如下图所示:

  从整体上来看,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的呢?如下图所示:

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

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

​  我这里没有讲这个函数是因为我参考的代码并不是这样做维度变换的,而是通过卷积的方式进行。听上去是不是很奇妙呢,下面就跟我一起来看看吧。为方便大家理解,这里我们拿具体的数字来举例。设原图的尺寸为224*224*3,每个块(patch)的尺寸为16∗16∗316*16*316∗16∗3,则我们一共会得到22416∗22416=14∗14=196\frac {224}{16}*\frac {224}{16} =14*14=19616224​∗16224​=14∗14=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维向量。🌱🌱🌱

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

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

图片来源于yutubu Shusen Wang老师

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

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

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

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

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

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

VIT模型参数

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

ModelPatch sizeLayersHidden SizeMLP sizeHeadsParamsVIT-Base16*161276830721286MVIT-Large16*16241024409616307MVIT-Huge14*14321280512016632M

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

实验结论

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

  这幅图展示了什么呢——作者本别在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) 用于图片分类🍁🍁🍁

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

本文链接地址:https://www.jiuchutong.com/zhishi/299422.html 转载请保留说明!

上一篇:【机器学习】python实现吴恩达机器学习作业合集(含数据集)

下一篇:强大的图片预览组件Viewer.js(强大的图片预览软件)

  • 苹果13怎么无线充电(苹果13怎么无线连接电脑)

    苹果13怎么无线充电(苹果13怎么无线连接电脑)

  • 在朋友圈如何发15秒视频(在朋友圈如何发文字消息)

    在朋友圈如何发15秒视频(在朋友圈如何发文字消息)

  • 微信运动关机后计步吗(微信运动关机后会更新吗)

    微信运动关机后计步吗(微信运动关机后会更新吗)

  • 苹果库乐队怎么退出到主页(苹果库乐队怎么下载不了)

    苹果库乐队怎么退出到主页(苹果库乐队怎么下载不了)

  • 拍屏幕有条纹怎么解决(拍屏幕有条纹怎么去掉照片)

    拍屏幕有条纹怎么解决(拍屏幕有条纹怎么去掉照片)

  • acadapter是什么充电器(ACADAPTER是什么充电器)

    acadapter是什么充电器(ACADAPTER是什么充电器)

  • nova7有没有nfc功能(nova7有没nfc功能)

    nova7有没有nfc功能(nova7有没nfc功能)

  • 微信正在输入中什么时候显示(微信正在输入中可以关闭吗)

    微信正在输入中什么时候显示(微信正在输入中可以关闭吗)

  • 苹果11用一会就发热(苹果11用一会就烫手)

    苹果11用一会就发热(苹果11用一会就烫手)

  • 一个演示文稿能用几个模板(一个演示文稿能用几次)

    一个演示文稿能用几个模板(一个演示文稿能用几次)

  • 华为主板坏了还能修吗(华为主板坏了还能用吗)

    华为主板坏了还能修吗(华为主板坏了还能用吗)

  • vivoy5s手机是什么时候上市的(vivoy5s手机是什么型号)

    vivoy5s手机是什么时候上市的(vivoy5s手机是什么型号)

  • vivo音乐歌词放到桌面(vivo手机音乐怎么显示歌词)

    vivo音乐歌词放到桌面(vivo手机音乐怎么显示歌词)

  • vivo手机计步器在哪里(vivo手机计步器在哪)

    vivo手机计步器在哪里(vivo手机计步器在哪)

  • 爱奇艺咋消广告(爱奇艺如何关广告)

    爱奇艺咋消广告(爱奇艺如何关广告)

  • airpods有一只连接不上(airpods有一只连不上 一直闪绿灯)

    airpods有一只连接不上(airpods有一只连不上 一直闪绿灯)

  • program file是什么文件(programfiles什么意思)

    program file是什么文件(programfiles什么意思)

  • 指纹机怎么调时间(指纹机怎么调时间图解)

    指纹机怎么调时间(指纹机怎么调时间图解)

  • qq音乐会员账号共享几个(qq音乐会员账号怎么查看)

    qq音乐会员账号共享几个(qq音乐会员账号怎么查看)

  • 怎么把视频分解成照片(怎么把视频分解成一张张图片手机)

    怎么把视频分解成照片(怎么把视频分解成一张张图片手机)

  • 手机 ud版什么意思(啥是ud版)

    手机 ud版什么意思(啥是ud版)

  • 企业微信收费吗(公司使用企业微信收费吗)

    企业微信收费吗(公司使用企业微信收费吗)

  • 支付宝短信校验服务如何关闭(支付宝短信校验码是什么意思)

    支付宝短信校验服务如何关闭(支付宝短信校验码是什么意思)

  • 充电显示可能不支持此配件(充电显示可能不支持此配件是手机问题还是充电器问题)

    充电显示可能不支持此配件(充电显示可能不支持此配件是手机问题还是充电器问题)

  • 如何使用这些工具自定义 Windows 11 外观(如何巧用工具)

    如何使用这些工具自定义 Windows 11 外观(如何巧用工具)

  • phpcms要钱吗(phpcms视频教程)

    phpcms要钱吗(phpcms视频教程)

  • 异地存货怎么审计
  • 一般纳税人企业所得税税率2023
  • 销项负数发票能用吗
  • 现金流量补充表的编制
  • 发票能加盖公章吗
  • 民办美术高中有哪些
  • 承租人与出租人签订了一份租赁合同,该设备
  • 财务报表分析方法有
  • 公司租房子出去物业费可以代付吗
  • 计提业务招待费和办公费需要附件吗?
  • 防伪税控发票种类主要有哪些
  • 年底增值税专用发票入帐不勾选抵扣帐务处理
  • 出口退税注销备注怎么填
  • 减免税款期末有余额吗
  • 房租发票9%还是5%
  • 上报汇总是什么时候
  • 实时扣税3001会计科目
  • 税法递延纳税
  • 6%的增值税发票能抵扣13%的吗
  • 亏损企业所得税汇算清缴怎么做
  • 福利性补贴包括哪些
  • 图书发票票样
  • 小额贷款公司可以放贷吗
  • 交易性金融资产公允价值变动计入
  • 生产企业销售给其他单位的生产工具
  • 市净率怎么计算举例说明
  • 无形资产可以占多少比例
  • 在win7中怎么安转只兼容win10的软件
  • 文件类型设置
  • 大沙丘国家公园在哪里
  • PHP:oci_new_collection()的用法_Oracle函数
  • 对于接受捐赠的资产价值,应计入当期损益
  • 正常开机进不去系统
  • php字符串操作函数
  • php运行js代码
  • 查补以前年度税款账务处理
  • PHP:json_last_error()的用法_JSON函数
  • 汇兑损益计入什么科目
  • 公司的内账
  • 微擎框架安装教程
  • php上传不了文件
  • 个人所得税其他扣除300一个月
  • 资本化支出影响营业利润吗
  • 赡养老人专项附加扣除的标准
  • 企业的净资产包括固定资产吗
  • 暂估成本多了
  • 一般纳税人报税需要填哪些表
  • 跨年度冲红字发票补正账务如何处理
  • 对方开给我的专票,我要报税吗?
  • 换出长期股权投资的会计处理
  • 为什么固定资产减值准备一经计提不得转回
  • 汇算清缴补交所得税的分录
  • 老板从公司借款怎么处理
  • 退客户多余货款怎么处理
  • 企业用地手续办理流程
  • 研发支出的定义
  • 新成立的公司工会经费免交一年吗
  • 个人生产经营所得税怎么申报
  • 股东之间转让股权有优先购买权吗
  • 总账选项设置步骤
  • ubuntu debain
  • mysql日期和时间函数
  • 如何设置window图标大小
  • macbookzen
  • 查看linux系统版本信息
  • ntfs硬盘分区整数
  • 微软系统如何恢复出厂设置
  • linux vi中查找内容
  • field.set方法
  • javascript居中
  • js获取checkbox选中的元素
  • android的handler
  • 讯飞src
  • 静态文件格式有哪些
  • android基础入门
  • python中的条件判断和循环语句
  • python 钉钉打卡定位
  • multiset volatile
  • 注销税务登记需要哪些材料
  • 怎样理解句子我还没弄清楚是怎么回事
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设