深度学习(10)---Vision Transformer详解

news2024/9/22 15:50:41

文章目录

  • 一、简介
  • 二、模型结构
    • 2.1 整体架构
    • 2.2 Linear Projection of Flattened Patches
    • 2.3 Transformer Encoder
    • 2.4 MLP Head
  • 三、ViT模型搭建参数
  • 四、思考题


一、简介

 1. Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,它将Transformer模型从自然语言处理(NLP)领域成功扩展到计算机视觉(CV)领域。

 2. Vision Transformer由Google Brain团队在2020年提出,该模型挑战了卷积神经网络(CNN)在视觉任务中的主导地位,证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效,在处理图像数据时也能取得卓越性能。

 3. Vision Transformer的核心思想是将输入的图像视为一个序列化的输入,通过自注意力机制来处理图像中的像素关系。具体而言,ViT首先将输入图像划分为多个固定大小的图像块(Patches),然后对每个图像块进行线性映射(Flattening + Linear Projection),将其转换成一个向量。这些向量连同一个特殊的分类Token一起作为Transformer的输入序列。这样,图像就被转换成了一个序列数据,从而可以直接应用自注意力机制进行特征提取。

二、模型结构

2.1 整体架构

 ViT模型如下架构图所示,其中主要有三个部分组成:(1) Linear Projection of Flattened Patches(Embedding层,将子图映射为向量);(2) Transformer Encoder(编码层,对输入的信息进行计算学习);(3) MLP Head(用于分类的层结构)。

在这里插入图片描述

在这里插入图片描述

2.2 Linear Projection of Flattened Patches

 1. Linear Projection of Flattened Patches(平铺块的线性投影)是ViT模型架构中的一个重要组成部分。这个过程主要涉及到将输入的图像数据转换为Transformer模型能够处理的一维向量序列。

 2. 作用与目的:
 (1)图像数据转换:由于标准的Transformer模型接收的是一维的嵌入序列,而图像数据是三维的(高度H、宽度W、通道数C),因此需要通过线性投影将图像数据转换为Transformer能够处理的格式。
 (2)信息提取:通过平铺和线性投影,图像被划分为多个小块(Patches),每个小块被转换为一个一维向量,这些向量包含了图像中的局部信息。

 3. 具体步骤:
 (1)图像划分:将输入图像按照预定的尺寸(如16x16)划分为多个小块(Patches)。以ViT-B/16为例,如果输入图像的大小为224x224,则会被划分为(224/16)x(224/16)=196个小块。

 (2)平铺操作:将每个小块展平(Flatten)为一维向量。

 (3)线性投影:使用一个线性层(通常是卷积层)将每个展平后的小块映射到一个更高维的向量空间中。这个线性层的作用是将每个小块的特征进行抽象和整合,以便后续的自注意力机制能够处理。以ViT-B/16为例,线性投影层通常使用一个卷积核大小为16x16、步距为16、卷积核个数为768的卷积来实现。这个卷积操作会生成一个形状为[14, 14, 768]的特征图(由于步距为16,所以高度和宽度都减少了),然后将其展平为[196, 768]的形状,即196个长度为768的向量(后面都直接称为token)。

在这里插入图片描述

 (4)添加特殊Token和位置编码:在所有向量序列的开头添加一个特殊的class Token(分类Token),用于后续的图像分类任务。这个Token是一个可训练的参数,与其他向量具有相同的维度。给每个向量添加一个位置编码(Position Embedding),以保留它们在图像中的位置信息。位置编码通常是可学习的,并且与向量的维度相同。

 4. 图像分块代码块:

class PatchEmbed(nn.Module):
    def __init__(self, input_shape = [224,224], patch_size = 16, in_channels = 3, num_features = 768, norm_layer = None, flatten = True):
        super().__init__()
        # num_patch就是可以划分多少个图像块,14*14的patch = 196
        self.num_patch = (input_shape[0] // patch_size) * (input_shape[1] // patch_size) 
        self.flatten = flatten
 
        self.proj = nn.Conv2d(in_channels, num_features, kernel_size=patch_size, stride=patch_size)
        self.norm = norm_layer(num_features) if norm_layer else nn.Identity()
 
    def forward(self, x):
        # proj就是对输入图像进行卷积分块
        x = self.proj(x) 
        if self.flatten:
            x = x.flatten(2).transpose(1, 2)
        x = self.norm(x)
        return x

 每个图像块都是经过一次特征提取的,可以对其中的一个图像块可视化一下看看:

在这里插入图片描述

# class token的定义
self.cls_token      = nn.Parameter(torch.zeros(1, 1, num_features))
# position embedding定义
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, num_features))

在这里插入图片描述

在这里插入图片描述

2.3 Transformer Encoder

Transformer Encoder是属于Transformer中的内容,具体请看:深度学习(6)—Transformer

 Encoder结构如下图所示,左侧为实际结构,右侧为论文中结构,省去了Dropout/DropPath层。
在这里插入图片描述

 MLP Block结构如下图所示,由全连接+激活函数+Dropout组成:

在这里插入图片描述

 经过多层Transformer Encoder处理后,最开始添加的分类Token的特征向量被提取出来,该向量包含了关于整个图像的综合信息。
 在Vision Transformer中,通常会在Transformer编码器的输出之后添加一个多层感知机(MLP)用于最终的任务输出,如在图像分类任务中预测类别。

2.4 MLP Head

 1. 在经过Transformer Encoder时,输入的shape和输出的shape保持不变。在论文中,以ViT-B/16为例,输入的是[197, 768]输出的还是[197, 768]。在Transformer Encoder后还有一个Layer Norm,结构图中并没有给出,如下图所示:
在这里插入图片描述

 2. MLP Head通过一系列的全连接层(Fully Connected Layers)和激活函数来将Transformer Encoder输出的表示向量进一步处理,以生成对应于不同类别的概率分布。

 3. 这里我们只是需要Transformer Encoder中的分类信息,所以我们只需要提取出class token生成的对应结果就行,即[197, 768]中抽取出class token对应的[1, 768],因为self-attention计算全局信息的特征,这个class token其中已经融合了其他token的信息。接着我们通过MLP Head得到我们最终的分类结果。

三、ViT模型搭建参数

 1. 为了方便大家理解,我自己根据源代码画了张更详细的图(以ViT-B/16为例):

在这里插入图片描述

 2. 在论文中有给出三个模型(Base/ Large/ Huge)的参数,在源码中除了有Patch Size为16x16的外还有32x32的。其中:
 (1)Layers是Transformer Encoder中重复堆叠Encoder Block的次数。
 (2)Hidden Size是对应通过Embedding层后每个token的dim(向量的长度)。
 (3)MLP size是Transformer Encoder中MLP Block第一个全连接的节点个数(是Hidden Size的四倍)。
 (4)Heads代表Transformer中Multi-Head Attention的heads数。
 (5)Params代表参数的个数。

ModelPatch SizeLayersHidden Size DMLP sizeHeadsParams
ViT-Base16x161276830721286M
ViT-Large16x16241024409616307M
ViT-Huge14x14321280512016632M

四、思考题

 为什么Vision Transformer比CNN效果好?
 (1)Vision Transformer采用了Transformer架构中的自注意力机制,这种机制能够捕获图像中任意两个像素或图像块之间的依赖关系,而不仅仅是局部信息。相比之下,CNN虽然能够提取局部特征,但在处理全局依赖关系时可能存在局限。
 (2)ViT通过将图像分割成一系列小块(patches)并作为序列处理,使得每个patch在模型中的表示都能够考虑到整个图像的信息,从而具有全局感受野。而CNN的感受野大小受限于卷积核的大小和网络的深度。

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

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

相关文章

UE基础 —— Playing and Simulating

目录 Play In Editor 运行(Play) Play Modes PIE Console Simulate In Editor 可以随时在虚幻编辑器中预览游戏,无需将其构建为独立的应用程序;能快速调整游戏玩法和资产,并了解相应调整带来的结果; …

vue全局参数

/* eslint-disable no-new */ new Vue({el: #app,router,components: { App },template: <App/>,data:function(){return{wbWinList: [] // 定义的变量&#xff0c;全局参数}}, }) //使用全局参数 // this.$root.backgroundColor 666;其它页面如果想监听改变 //监听全…

【JAVA基础】this关键字与final关键字

文章目录 this关键字final关键字Java值传递 this关键字 this代表当前对象&#xff0c;有时候不太方便直接使用对象&#xff0c;可以用this **用法1&#xff1a;**this.属性名 在类中调用全局变量 举个例子&#xff1a; public class Student1 {public String name;public S…

密文域可逆信息隐藏与掩码自动编码器(MAE)

原文题目&#xff1a;Reversible data hiding in encrypted images based on pixel-level masked autoencoder and polar code Source: Signal Processing Authors: Zhangpei Cheng, Kaimeng Chen , Qingxiao Guan 发表年份&#xff1a;2024年 学习这篇文章主要原因是结合了…

Leetcode 46.全排列

注意的点&#xff1a; 1、回溯本质就是搜索树的树枝&#xff0c;维护三个核心变量&#xff1a;path&#xff08;需要恢复现场&#xff09;&#xff0c;visited&#xff08;需要恢复现场&#xff09;&#xff0c;以及res 解法&#xff1a;回溯算法 class Solution:def permut…

iphone问题笔记

拼音打字显示一些不相干的词 原因&#xff1a;开启了自动改正&#xff0c;傻逼iphone总以为你打错了。 计算器没有退格键&#xff1f; 解决方法&#xff1a;按住数字往右滑是退格。 关机重启必须去设置里&#xff1f; 连按五次锁屏可以选择关机。

[新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

sunshinemoonlight 解决黑神话悟空 本地串流投屏 背景:偶然间在B站发现了sunshinemoonlight方案,替代hdmi线,做本地串流...于是心灵手巧的我开始尝试踩坑之路:1.准备安装包2.开始安装2.1 笔记本windows安装sunshine2.2 遇到了第一个坑.Fatal: ViGEmBus is not installed or run…

matplotlib绘制子图以及局部放大效果

需求&#xff1a;绘制1*2的子图&#xff0c;子图1显示两个三角函数&#xff0c;子图2显示三个对数函数&#xff0c;子图2中对指定的区域进行放大。 绘图细节&#xff1a; 每个子图中每个函数的数据存放到一个列表中&#xff0c;然后将每个子图的数据统一存到一个列表中&#…

亿发详解:ERP系统选择的艺术——中小企业如何避免实施陷阱?

有很多中小工厂反应&#xff0c;工厂上了一套精细化ERP系统后&#xff0c;却发现为了适应系统&#xff0c;不仅效率没提高&#xff0c;工作量还变大了&#xff0c;很多功能也根本用不到。这种情况其实并不少见。许多企业在引入ERP系统后&#xff0c;反而遇到了各种问题。说到底…

RocketMQ学习(一)

文章目录 参考1. MQ 介绍1.1 为什么要用 MQ应用解耦流量削峰数据分发 1.2 MQ 的优点和缺点1.3 各种 MQ 产品的比较 2. RocketMQ 快速入门2.1 准备工作2.1.1 下载 RocketMQ2.2.2 环境要求安装jdk 2.2 安装 RocketMQ2.2.1 安装步骤2.2.2 目录介绍 2.3 启动 RocketMQ示例 2.4 测试…

配置错误酿大祸:.env文件泄漏导致数千组织云端数据遭受攻击

攻击者从不安全存储在数以万计的 Web 应用程序的环境变量中收集 Amazon Web Services 密钥和各种云服务的访问令牌。 Unit 42 研究人员发现了一种数据勒索活动&#xff0c;该活动主要是攻击者通过从不安全地存储在 Web 服务器上的环境 &#xff08;.env&#xff09; 文件&#…

空气净化器怎么选能除猫毛?宠物空气净化器除味好的分享

我有一位呼吸科医生朋友&#xff0c;他自己也养猫。他常向我们这群养宠物的朋友传授关于宠物毛发潜在危害的知识&#xff0c;引来不少幽默的回应&#xff1a;“既然如此&#xff0c;干脆把猫送走算了&#xff1f;”开玩笑&#xff0c;自己养大的猫跟亲生的有什么区别。我注意到…

搭建FTP服务器,通过浏览器访问FTP服务器,测试终端上传的音频文件。

文章目录 引言I 搭建FTP服务器II 浏览器访问FTP文件PC端浏览器访问iphone-safari浏览器访问FTP设置Mac-Safari浏览器访问FTP设置III FTP基础知识FTP客户端数据连接: 被动模式(PASV)引言 需求: 通过浏览器访问,测试终端通过FTP上传的语音文件,支持直接播放语音文件。 建议…

[数据集][目标检测]风力发电机叶片损伤检测数据集VOC+YOLO格式5029张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5029 标注数量(xml文件个数)&#xff1a;5029 标注数量(txt文件个数)&#xff1a;5029 标注…

【MATLAB学习笔记】绘图——分割绘图背景并填充不同的颜色

目录 前言分割背景函数示例基本绘图分割背景函数的使用保存图片 总代码总结 前言 在MATLAB中&#xff0c;使用窗口对象的Color属性可以轻松地设置不同的背景颜色&#xff0c;但是只能设置一种单一颜色。若需要将绘图背景设置成多种颜色&#xff0c;比如左右两边不同的颜色&…

Gradio.NET支持 .NET 8 简化 Web 应用开发

目录 前言 Gradio.NET Gradio.NET 使用 1、创建项目 2、安装 Gradio.Net 3、示例代码 Gradio.NET 示例 1、Layout 2、Form 3、Media 4、Chatbot 5、Progress Gradio.NET 应用 项目地址 总结 最后 前言 Gradio.NET 是 Gradio 在 .NET 平台上的移植版本。Gradio …

内容为王:数字化营销的致胜法宝

​在当今数字化时代&#xff0c;营销环境发生了巨大变化。消费者被海量信息包围&#xff0c;注意力成为必争资源。在这种情况下&#xff0c;“内容为王” 的理念愈发凸显其重要性&#xff0c;成为数字化营销的致胜法宝。 1. 吸引用户注意力 高质量、有价值的内容能够在众多信息…

推荐好古文《马说》

韩愈 世有伯乐&#xff0c;然后有千里马。千里马常有&#xff0c;而伯乐不常有。故虽有名马&#xff0c;只辱于奴隶人之手&#xff0c;骈死于槽枥之间&#xff0c;不以千里称也。 马之千里者&#xff0c;一食或尽粟一石。食马者不知其能千里而食也。是马也&#xff0c;虽有千…

【Python最全系统学习路线】:千万不要盲目自学Python,顺序真的很重要!

如果你一直想学Python&#xff0c;但是不知道如何入手&#xff0c;那就别犹豫了。这篇文章就是为你写的。 根据我自己的经验来说&#xff0c;想从零开始学Python&#xff0c;以后也确实想找相关的工作&#xff0c;基本是下边这三种方式&#xff1a; 继续上学。报个这方面的专业…

WiFi的IP和电脑IP一样吗?怎么更改wifi的ip地址

在数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。无论是通过手机、电脑还是其他智能设备接入互联网&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;很多用户对于WiFi的IP地址与电脑&#xff08;或…