Vision Transform—用于大规模图像分类的Transformers架构
VIT — 用于大规模图像识别的 Transformer
论文题目:AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。
官方代码:https://github.com/google-research/vision_transformer
引言与概述
Vision Transformer(ViT)是一种基于注意力机制的深度学习模型,它是由 Google 提出的,旨在将Transformer架构应用到计算机视觉任务中。它的提出证明了: Transformer 在CV领域的可行性。
Transformers在之前可以和CNN结合起来用增强特征图的方式用于分类和检测。
-
而在vision Transform中没有使用到深度的2d卷积,完全使用Transform中的多头自注意力机制,与Encode结构进行实现的
-
输入的patches的结构经过一个vit块后的结构保持不变,因此可以用来直接对vit块进行N次的堆叠操作。
Vision Transformer(ViT)模型架构是一种基于 Transformer 架构的深度学习模型,用于处理计算机视觉任务(最主要的是会应用到分类的任务中)。下面是 Vision Transformer 的模型框架。
-
Linear Projection of Flattened Patches模块(Embedding层):将输入的图像数据转换为可以输入到 Transformer 编码器中的序列化表示,其中包括了patch+position+learnable embedding。
-
Transformer encoder (Transformer编码层):向量表示被输入到 Transformer 编码器中。每个 Transformer 编码器包含多头自注意力机制和前馈神经网络,用于捕捉全局信息和学习特征表示。这一部分是 Vision Transformer 中最关键的组件。
-
MLP Head(用于分类的全连接层):在经过一系列 Transformer 编码器之后,模型的输出会被送入一个包含多层感知机(MLP)的输出层中,用于最终的分类或其他计算机视觉任务。
处理流程
-
输入阶段: 首先将输入的原始图像按照给定大小切分成固定大小的图像块(patches),每个图像块包含图像中的局部信息。 每个图像块通过一个线性变换(通常是一个卷积层)映射到一个低维的特征空间,得到Patch Embeddings。同时,为每个Patch Embedding加入位置编码(Positional Embedding)和可学习嵌入(learnable Embedding) 以综合考虑图像的空间位置和全局信息。
-
输入到Transformer: 将经过嵌入层处理的序列化表示作为输入,传入到多层Transformer Encoder来对序列化表示进行处理。
-
输出分类结果: 经过一系列Transformer编码器的处理后,模型的最后一层输出向量经过全连接层或其他分类层进行分类任务。
图像处理与前向传播
在论文中提到过,在Vit Transform提出之前,其实就有人使用过将图像中的每一个像素看作是一个序列数据,本质上就是将图像的像素数据进行一个展平操作=WxHx3个像素,就会导致图像得到的序列数据过长从而影响整个的运算。
作者就针对这一个问题提出了使用Transformer receives as input a 1D
sequence of token embeddings. To handle 2D images, we reshape the image x ∈ RH×W×C into asequence of flattened 2D patches xp ∈ RN×(P2·C)(使用patch方法将2d的数据转换为1d的数据,但是是切分为多个小的patch块进行的。)
Patch Embedding
Patch Embedding 是指将输入的图像划分为固定大小的图像块(patches)后,将每个图像块映射成一个向量表示,最终所有的图像块被变换成满足transformer输入的一维表示。
将输入为224x224的图像,切分为196个16x16的Patch图像块。
我们从50176个token转变为了196个token从而降低了序列的长度。
-
图像划分为图像块: 输入的原始图像被切分成大小相同的图像块,每个图像块通常是不重叠的固定大小的方形区域。这样做的目的是为了将图像信息分割为局部区域,使得模型能够处理不同尺寸的图像。 例:以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到 ( 224 / 16 ) 2 = 196 ( 224 / 16 )^2 = 196 (224/16)2=196个Patches,每个Patche数据shape为[16, 16, 3]。
-
映射为向量表示: 对于每个图像块,通过一个线性变换(一个卷积层)将其映射成一个一维特征向量,也称为 Patch Embedding。这个过程可以理解为将图像块中的像素信息转换为一个固定维度的向量,以表示该图像块的特征。 例:每个Patche数据通过映射得到一个长度为768的向量,即[16, 16, 3] -> [768]
- 串联所有 Patch Embedding: 将所有图像块经过 Patch Embedding 后得到的向量表示串联在一起,形成一个序列化的特征矩阵。这个矩阵作为Transformer的输入,传入Transformer编码器进行处理。 例:将196个Patchs串联起来,最终组成[196,768]的二维token向量,token的个数是196,token维度是768
Class token + Positional Embedding
Class token
在ViT模型的原论文中,作者模仿BERT模型,为ViT 模型中引入一个专门用于分类的 [class] token。这个 [class] 是一个可训练的参数,其数据格式和其他 token 一样都是一个向量,例如在 ViT-B/16 模型中,这个向量的长度是768
其中引入的class token代表的是一个可以学习的张量。
引入了class token之后就需要和经过Linear Projection of Flattened Patches展平之后得到的向量进行一个cat
的操作。
下面给出运算步骤的一个示意图。‘
我们最后得到的信息就是,批次数 + (196+1)[经过cat连接操作] +768(论文中D的长度)
向量拼接: 将 [class] token 的向量与之前从图片中生成的 tokens 拼接在一起。例如,原先有 196 个 tokens,每个 token 长度为 768,则token embeddding变为Cat([1, 768], [196, 768]) -> [197, 768],注意, [ c l a s s ] [class] [class] token插在开头。
之后我们还需要加入位置编码就可以对位置信息进行编码从而输入序列数据进入Transform的多头自注意力机制模块。
ViT的Position Embedding采用的是一个可学习/训练的 1-D 位置编码嵌入,是直接叠加在tokens上的(add), 例: position embedding的shape应该是[197,768],直接position embedding + [ c l a s s ] [class] [class] token embedding=[197,768]
相加的操作不改变整体的一个维度信息。
使用什么样的位置编码对结果的影响不是特别的大。
Transformer encode
Transformer encoder在代码中有时是打包在Block里面的。
Transformer Encoder 是用来处理输入序列的部分,它由多个 Transformer Block 组成。每个 Transformer Block 都包括两个主要组件:多头自注意力层和前馈神经网络。
包括了两个残差连接的部分所组成。
-
Multi-head Self-Attention Layer: 在每个 Transformer Block 中,输入特征首先被送入一个多头自注意力层。这个层用来计算输入序列中每个位置对应的注意力权重,以捕捉不同位置之间的关系。
-
Feed-Forward Neural Network: 在经过多头自注意力层后,每个位置的特征会通过一个前馈神经网络进行处理。这个前馈神经网络通常由两个全连接层和激活函数组成,用来对每个位置的特征进行非线性变换和映射。
-
Residual Connection & Layer Normalization: 在每个 Transformer Block 的多头自注意力层和前馈神经网络中都会包含残差连接和层归一化操作,这有助于缓解梯度消失问题和加速训练过程。
多个Transformer encode模块进行堆叠,ViT 模型能够有效地学习输入图像的复杂特征和结构信息。(代码中好像是连续堆叠三次)多头注意力部分使用之前的类进行单独的定义。
论文中给出的一个前向传播的基本的公式形式。
等式 1:由 图像块嵌入 x p i E x_p^iE xpiE,类别向量 x c l a s s x_{class} xclass,位置编码 E p o s E_{pos} Epos构成 输入向量 z 0 z_0 z0
等式 2:由 多头注意力机制、层归一化和跳跃连接构成的 MSA Block,可重复L个,最后一个输出为 z l ‘ z_l^{‘} zl‘
等式 3:由 前馈网络、层归一化 和 跳跃连接构成的 MLP Block,可重复L个,最后一个输出为 z l z_l zl
等式 4:由 层归一化 和 分类头 (MLP or FC) 输出 图像表示 y y y
MLP Head
先进行一个4倍的扩增,之后在通过一个线性层进行下采样的一个操作,使得输入输出的大小保持不变。(隐藏层拓为4倍)
注意和之前还有做一次残差连接的操作。
MLP Head 是指位于模型顶部的全连接前馈神经网络模块,用于将提取的图像特征表示转换为最终的分类结果或其他预测任务输出。MLP Head 通常跟在 Transformer Encoder 的输出之后,作为整个模型的最后一层。
具体来说,当我们只需要分类信息时,只需要提取出 [ c l a s s ] [class] [class]token生成的对应结果就行,即[197, 768]中抽取出[class] token对应的[1, 768]。接着我们通过MLP Head得到我们最终的分类结果。MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。
取出class token对应的那一部分代码信息,(197-1)
维度变换总结
总结:
-
输入图像的input shape=[1,3,224,224],1是batch_size,3是通道数,224是高和宽输入图像经过patch Embedding,其中Patch大小是14,卷积核是768,则经过分块后,获得的块数量是 196,每个块的维度被转换为768,即得到的patch embedding的shape=[1,196,768]
-
将可学习的[class] token embedding拼接到patch embedding前,得到shape=[1,197,768]
-
将position embedding加入到拼接后的embedding中,组成最终的输入嵌入,最终的输入shape=[1,197,768]
-
输入嵌入送入到Transformer encoder中,shape并不发生变化
-
最后transformer的输出被送入到MLP或FC中执行分类预测,选取[class] token作为分类器的输入,以表示整个图像的全局信息,假设分类的类目为K,最终的shape=[1,768]*[768,K]=[1,K] K也就是分类的类别数目。
最后总结的VIT-b/16模型所对应的结构示意图如图所示。
论文中还给出了通过训练之后得到的位置编码直接的余弦相似度的示意图。
相关文章:

Vision Transform—用于大规模图像分类的Transformers架构
VIT — 用于大规模图像识别的 Transformer 论文题目:AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码:https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer(ViT&…...
内核驱动开发之系统移植
系统移植 系统移植:定制linux操作系统 系统移植是驱动开发的前导,驱动开发是系统运行起来之后,在内核中新增一些子功能而已 系统移植就四个部分: 交叉编译环境搭建好bootloader的选择和移植:BootLoader有一些很成熟…...
前端在网络安全攻击问题上能做什么?
前端在Web网络安全攻击问题上扮演着至关重要的角色,可以通过多种措施来增强Web应用的安全性。以下是前端在应对Web网络安全攻击时可以采取的具体行动: 1. 输入验证和过滤 严格验证用户输入:前端应对所有用户输入进行严格的验证,…...
IntelliJ IDEA 创建 HTML 项目教程
传送门 IntelliJ IDEA 是 JetBrains 提供的一款强大且多功能的集成开发环境(IDE),不仅可以用于 Java 开发,还支持多种其他编程语言和技术,包括 HTML、CSS 和 JavaScript 等前端开发工具。本文将带你逐步了解如何使用 IntelliJ IDEA 创建一个 HTML 项目,并配置适合前端开…...

YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
摘要 轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级 ViTs 和轻量级 CNNs 之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在…...

VBS学习1 - 语法、内置函数、内置对象
文章目录 概述执行脚本语法转义字符文本弹框msgbx定义变量dim(普通类型)定义接收对象set字符拼接&用户自定义输入框inputbox以及输入判断ifelse数组(参数表最大索引,非数组容量)有容量无元素基于元素确定容量 循环…...
11 vue3之插槽全家桶
插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…...
Excel 基础知识-操作手册1
Excel基础操作知识 一、工作窗口的视图控制 1、创建新窗口:依次点击【视图】----【新建窗口】命令,即可为当前工作簿创建新的窗口。在原有的工作簿中更改标题或表格内容时,新建的工作簿也会相应的更改。 2、窗口切换:在【视图】…...
Python 类的继承
Python 的代码组织如下: moudle:模块,和实例名和函数都是小写加下划线的方法表示。 class:类,使用首字母大写驼峰的写法表示。 类里面包含类的属性,__init__ ()方法和类的方法。 __init__() 方法在类的创建…...

gRPC介绍
gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用( Remote Procedure Calls)框架,具备良好的兼容性,可在多个开发环境下运行。 相较于目前主流的 HTTP API 接口,gRPC 接口采用了领先的 HTTP/2 底层架构设计作…...

Git之误执行git rm -r解决方案(六十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
html文件指什么
HTML 文件指的是超文本标记语言文件(HTML,HyperText Markup Language),它是用于构建网页内容的文件格式。HTML 文件包含一系列的标签(tags),这些标签用于定义网页的结构和元素,例如文…...

AAAI2024--频谱在多模态表示和融合中的作用更为有效:A Multimodal Spectrum Rumor Detector
https://github.com/dm4m/FSRU 多模态内容,如将文本与图像混合,对社交媒体中的谣言检测提出了重大挑战。现有的多模态谣言检测侧重于在空间和序列位置之间混合令牌进行单模态表示,或者在模态间融合谣言真实性的线索。然而,它们受…...

【Python报错已解决】SyntaxError invalid syntax
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

CI/CD持续集成和持续部署以及相关软件的使用
目录 一:CI/CD是什么? 1.1 持续集成(Continuous Integration) 1.2 持续部署(Continuous Deployment) 1.3 持续交付(Continuous Delivery) CI/CD 的好处包括: 二:git…...
Charles mac电脑配置
安装 Charles: 如果你还没有安装 Charles,可以从官方网站下载安装包并按照提示完成安装。 启动 Charles: 安装完成后,启动 Charles 应用程序。 设置 Charles 代理: Charles 默认的代理端口是 8888。你可以通过以下步…...

FPGA基本结构和简单原理
前言: FPGA全程为(Field Programmable Gate Array)现场可编程逻辑阵列,以基本的逻辑为主可以实现大多数芯片可以实现的功能,比如说:ASIC芯片等,在半导体领域有着重要的作用。 本文…...

【machine learning-七-线性回归之成本函数】
监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b,使成本函数值最小化? 在线性回归中,我们说到评估模型训练中好坏的一个方法,是用成本函数来衡量,下面来详细介绍一下 成本函数…...

Stable Diffusion Fooocus批量绘图脚本
当当当挡~,流动传热数值计算之余发布点AIGC相关文章,希望大家能喜欢~ 1 Stable Diffusion各种UI分析对比 提示:此部分主要是对SD各种界面的简要介绍和对比,只关注Fooocus批量绘图的读者可直接跳到第二部分。 Stable Diffusion …...

Web 安全基础教程:从零基础入门到精通
一、Web 安全概述 (一)Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁,确保 Web 服务的保密性、完整性和可用性。在当今数字化时代,Web 应用广泛存在于各个领域,从电子商务到社交媒…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...