当前位置: 首页 > news >正文

【深度学习】深刻理解ViT

        ViT(Vision Transformer)是谷歌研究团队于2020年提出的一种新型图像识别模型,首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理(如BERT和GPT),而ViT展示了其在视觉任务中的潜力。ViT的核心思想是将图像划分为小的固定大小的块(patches),然后将这些块视为一个序列输入Transformer模型,类似于NLP中的词序列。这种方法不同于传统的卷积神经网络(CNN),它不依赖卷积操作,而是完全基于全局的自注意力机制。

论文原文:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

1. 方法

        Transformer用encoder-decoder结构,通过学习语言的拆解组装对照表,实现了很好的机器翻译效果。BERT模型在此基础上通过encoder间的团结协作,在NLP领域实现了多种任务的处理。而视觉领域就是ViT模型了。与BERT相比,ViT的主要框架没有什么改变,都是采用多个Transformer encoder,依然使用多层多头的结构。其主要工作在于输入阶段,把图片进行向量化,转换成embeddings的词结构,从而实现了NLP中类似句子一样的效果,后续encoder的操作和原始Transformer中完全相同。

1.1. patch embedding

        就如同ViT的题目所说的那样,将原始二维图像分成小块,称为patch,大小为16x16。每个patch也就相当于在机器翻译中句子中的一个词,然后经过全连接层,把patch压成一个向量。在向量的开头加入class token <cls>,目的是便于后期实现特征分类。

1.2. position embedding

        将这个长x宽x通道数的矩阵表示进行展平,然后通过一个共享的线性层投射到Transformer模型里面的特征维度,比如1024。在投影后的固定长度的向量上加入tokens的位置信息,即加入一个可学习的向量,为后面的self-attention计算做准备。位置编码可以理解为一张表,表一共有N行,N的大小和输入序列长度相同,每一行代表一个向量,向量的维度和输入序列embedding的维度相同,其中位置编码的操作是sum,而不是concatenate。因为后面采用的是Transformer Encoder,每个Token不论在哪个位置都可以看到所有的Token。

  • 1-D 位置编码:例如3x3共9个patch,patch编码为1到9

  • 2-D 位置编码:patch 编码为11,12,13,21,22,23,31,32,33,即同时考虑X和Y轴的信息,每个轴的编码维度是D/2

  • 实际实验结果表明,不管使用哪种位置编码方式,模型的精度都很接近,甚至不适用位置编码,模型的性能损失也没有特别大。原因可能是ViT是作用在image patch上的,而不是image pixel,对网络来说这些patch之间的相对位置信息很容易理解,所以使用什么方式的位置编码影像都不大。

1.3. MLP Head

        Transformer之后的MLP Head其实就是一个全连接层,先把输入时添加的分类向量拿出来,输入到这个网络里,输出就是图像的分类类别了。

2. ViT训练

        与BERT模型类似,ViT也根据encoder层数的不同训练连三种模型——ViT-BaseViT-LargeViT-Huge。patch size越小,序列越长,计算代价越大,一般来说效果也会越好。ViT的训练与BERT一样,也分为pre-training和fine-tuning两个过程。    

        论文中对学习到的位置编码进行了可视化,发现相近的图像块的位置编码较相似,且同行或列的位置编码也相近。随着encoder的增加,每个头关注的像素距离越来越远,关注全局信息。

参考资料:

ViT(Vision Transformer)解析 - 知乎icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/445122996

【深度学习】详解 Vision Transformer (ViT)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_39478403/article/details/118704747

【ViT模型】Transformer向视觉领域开疆拓土……_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV13B4y1x7jQ?spm_id_from=333.788.videopod.sections&vd_source=0dc0c2075537732f2b9a894b24578eed

VIT (Vision Transformer)深度讲解_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV15RDtYqE4r/?spm_id_from=333.337.search-card.all.click&vd_source=0dc0c2075537732f2b9a894b24578eed

http://www.lryc.cn/news/502666.html

相关文章:

  • 解决vue2中更新列表数据,页面dom没有重新渲染的问题
  • vscode通过ssh连接远程服务器(实习心得)
  • 知识图谱9:知识图谱的展示
  • leetcode 面试经典 150 题:验证回文串
  • 【0363】Postgres内核 从 XLogReaderState readBuf 解析 XLOG Record( 8 )
  • docker tdengine windows快速体验
  • 详解RabbitMQ在Ubuntu上的安装
  • Python的3D可视化库【vedo】2-2 (plotter模块) 访问绘制器信息、操作渲染器
  • 【vue2】文本自动省略组件,支持单行和多行省略,超出显示tooltip
  • 网络安全产品之认识防病毒软件
  • 游戏引擎学习第42天
  • 区块链智能合约( solidity) 安全编程
  • GUNS搭建
  • 【ETCD】【源码阅读】stepWithWaitOption方法解析
  • redis 怎么样查看list
  • E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
  • 创建型设计模式
  • 仿iOS日历、飞书日历、Google日历的日模式
  • vuedraggable
  • 新手从事直播软件源码开发搭建经验与技巧
  • 相机不动,机构动作----Hands Eyes
  • Scala的导入
  • vue2中父子组件传值案例总结
  • 功能篇:springboot中实现文件导出
  • Redis客户端(Jedis、RedisTemplate、Redisson)
  • Mybatis中SQL的执行过程
  • 【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
  • 【论文阅读】PRIS: Practical robust invertible network for image steganography
  • 在Linux桌面系统普及化方面的一些建议
  • LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程