ViT(Vision Transformer)网络结构详解

news2024/11/26 11:30:59

本文在transformer的基础上对ViT进行讲解,transformer相关部分可以看我另一篇博客(transformer中对于QKV的个人理解-CSDN博客)。

一、网络结构概览

上图展示了Vision Transformer (ViT) 的基本架构,我按照运行顺序分为三个板块进行讲解。以下是 ViT 处理图像的基本步骤:

  1. Embedding(Linear Projection of Flattened Patches):首先,输入图像被分割成固定大小的patch。每个patch被展平并经过一个线性层,将其转换为特征向量。此外,每个特征向量都会附加一个表示其在原始图像中相对位置的位置嵌入。

  2. Transformer 编码器(Transformer Encoder):这些预处理过的特征向量作为输入馈送到一系列的 Transformer 层进行编码。每个 Transformer 层包含多头注意力机制(Multi-Head Attention)和前馈神经网络(Feed-Forward Network)。在每个 Transformer 层之间有层归一化(Layer Normalization),以保持特征分布的一致性。

  3. MLP Head 和分类(MLP Head):最后,来自 Transformer 编码器的最后一层输出通过一个多层感知机(MLP)头部,通常是一个简单的全连接层,用于执行最终的任务,如图像分类。在这个阶段,模型将学习到的特征映射到类概率空间。

上图是另外一个大佬做的细致一点的网络结构图。

1. Embedding

我将Embedding分为4个步骤:

  1. 分割patch
    首先输入为一张图片,vit中默认将图像缩放为224*224,通常利用16*16的patch进行划分得到(224*224) / (16*16)=14*14=196张子图,每张patch的大小为16*16,3通道。
  2. 转换获得token
    将每个二维的补丁转换为可以输入到 Transformer 的一维序列,将14*14个patch展平成一个长向量,再通过线性变换得到196个token,token的长度为768。


    然而,在vit中是利用768个卷积核大小为16*16,stride为16,padding为0的一个卷积层直接对224*224的输入图像进行卷积,从而得到14*14*768的输出,再对其展平得到[196,768]的token,相当于合并了第一步和第二步。
  3. 拼接上类别token

    之后在得到的196个 token 的前面加上加上一个新的Class Token(即图中0号紫色框右边带*的那个框,这不是通过某个patch产生的。其作用类似于BERT中的Class Token。),得到[197,768]的数据。
    在ViT中,Class Token(通常记为CLS)是一个可学习的参数。它在网络初始化时被随机初始化,类似于其他神经网络权重参数。在经过多层Transformer编码器后,Class Token会聚集来自所有图像块的信息,形成图像的全局表示。最终的Class Token表示(即最后一层Transformer编码器输出的Class Token)被输入到一个分类头(通常是一个全连接层)中,用于图像的分类任务。分类头的输出即为预测的类别概率分布。

  4. 加上位置编码

    patch得到的图像是没有位置信息的,需要用position embedding将位置信息加到模型中去。如上图所示,编号有0-9的紫色框表示各个位置的position embedding
    位置编码是
    可训练的编码,通过叠加加入到[197,768]的数据中,最终输出[197,768]的数据。


    加了位置编码,性能有明显提升,但是不同编码器的方式对性能提升差不多。所以源码中使用的是1-D位置编码。


    上图呈现了一个热力图,其中水平轴代表输入补丁的列数,垂直轴代表输入补丁的行数,颜色深浅表示相似程度。
    通过观察热力图,我们可以看到随着补丁距离变远,它们的位置嵌入变得越来越不相似。在真实世界中,离得近的物体往往比离得远的物体具有更强的空间相关性。这种特性有助于 ViT 更好地理解图像内容及其结构。

2. Transformer 编码器

Transformer encoder层如图所示,Transformer encoder重复堆叠 L 次,整个模型也就包括 L 个 Transformer。关于Layer Norm和多头注意力模块的具体解析可以看我主页其他的博客,这里不过多赘述。
MLP中先通过一个线性层将输入数据的通道数变为原来的4倍,之后通过GELU激活函数和Dropout,再通过一个线性层将4倍通道数变为原来的通道数。

3. MLP Head 和分类

MLP Head 层位于 Transformer 编码器之后,用于完成特定任务,如图像分类。该层通常是一个多层感知机(Multilayer Perceptron,简称 MLP),它接收来自 Transformer 编码器的输出,并对其进行进一步处理以生成最终的预测。在不同的场景下,MLP Head 的结构可能会有所不同。

在这张图片中,我们能看到两种情况下的 MLP Head 设计:

  1. 训练 ImageNet21K 时的 MLP Head

    当训练 ViT 时,特别是在大型数据集如 ImageNet21K 上,MLP Head 包含三个组成部分:线性层、tanh 激活函数以及另一个线性层。这样的设计允许 MLP Head 对编码器输出进行非线性的转换,以适应复杂的模式和特征。激活函数 tanh 提供了一种非线性变形,可以帮助模型学习更复杂的表示。
  2. 迁移至 ImageNet1K 或其他数据集时的 MLP Head

    当将 ViT 迁移到较小的数据集,如 ImageNet1K 或者自己的数据集时,通常只保留一个线性层。这是因为较小的数据集可能不需要那么多的复杂性,一个线性层就足以提供足够的泛化能力。减少层数也可以降低过拟合的风险。

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

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

相关文章

配置web服务器

当访问网站www.haha.com时显示:haha;当访问网站www.xixi.com/secret/显示:this is secret 第一步,配置一个新的IP 确认后 esc返回 第二步:重启ens160 第三步:创建目录,并且在文件内写入内容 第…

英福康INFICON UL1000检漏仪介绍PPT

英福康INFICON UL1000检漏仪介绍PPT

【周记】2024暑期集训第二周(未完待续)

文章目录 日常刷题记录合并果子题目解析算法思路代码实现 中位数题目解析算法思路代码实现 C学习笔记队列queue双端队列 deque优先队列 priority_queue定义常见操作 upper_bound 日常刷题记录 合并果子 题目解析 有一堆果子,每次可以将两小堆合并,耗费…

verilog行为建模(四):过程赋值

目录 1.两类过程赋值2.阻塞与非阻塞赋值语句行为差别举例13.阻塞与非阻塞赋值语句行为差别举例24.阻塞与非阻塞赋值语句行为差别举例35.举例4:非阻塞赋值语句中延时在左边和右边的差别 微信公众号获取更多FPGA相关源码: 1.两类过程赋值 阻塞过程赋值执…

漫威争锋Marvel Rivals测试搜不到 漫威争锋Marvel Rivals怎么搜

漫威争锋,一款今年即将上线的6v6的fps游戏,漫威争锋Marvel Rivals一经公布就吸引了广大玩家的兴趣。玩家将在游戏中扮演一名名经典且有趣的漫威英雄,与敌人展开对决。而且该游戏中有着很多的漫威英雄供我们挑选使用,有着很多英雄的…

【数据结构】排序算法——Lessen1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

音乐播放器的优雅之选,黑金ONIX Overture XM5,更悦耳的音质体验

如今想要随时沉浸式的体验高品质的数字音乐资源,一款简单好用的音乐播放器必不可少,多年来在音乐爱好者的心中的经典品牌屈指可数,英国品牌ONIX算是一个,其Horizon系列以优雅的设计以及出众的品质,收获了很多忠实粉丝。…

OpenAI发布迷你AI模型GPT-4o mini

本心、输入输出、结果 文章目录 OpenAI发布迷你AI模型GPT-4o mini前言OpenAI发布迷你AI模型GPT-4o mini英伟达联合发布 Mistral-NeMo AI 模型:120 亿参数、上下文窗口 12.8 万个 tokenOpenAI发布迷你AI模型GPT-4o mini 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csd…

【ADRC笔记】LESO-Wb

公式推导(bilibili) 一阶ESO 二阶ESO 二阶自抗扰控制器基本原理 选取状态变量 观测器收敛性推导 wo 观测器带宽

C语言·函数(超详细系列·全面总结)

前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下函数的知识点,我们一起来看看吧! 目录 一、函数是什么 &a…

HTTPServer改进思路1

Nginx源码思考项目改进 架构模式 事件驱动架构(EDA)用于处理大量并发连接和IO操作 优点:高效处理大量并发请求,减少线程切换和阻塞调用技术实现:直接使用EPOLL,参考Node.js的http服务器 网络通信 协议:HTT…

day6 io线程

获取终端输入的字符

记录 cocos 开发问题 ,微信 wx.xxx函数 报找不到名称“wx”

今天写微信排行榜遇到 问题分享一下。 目前,微信、百度 和 抖音 小游戏这些平台为了保护其社交关系链数据,增加了 开放数据域 的概念,这是一个单独的游戏执行环境。开放数据域中的资源、引擎、程序,都和主游戏(主域&a…

【2】Spring Cloud 工程搭建

🎥 个人主页:Dikz12🔥个人专栏:Spring Cloud实战📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.声明项目依赖和项目构建插件 2.完善子项目订单服务 2.1完善启动…

[Spring] Spring配置文件

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Spring推出Spring AI框架,看看怎么个事

文章目录 概述SpringAI介绍Spring AI 提供以下功能支持的聊天模型有哪些支持的文生图的模型有哪些支持的音频到文本模型支持的嵌入模型有哪些支持的矢量数据库有哪些 概述 在当今快速发展的技术时代,人工智能(AI)已经成为各行各业的关键驱动…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个,其语法如下: expression?value1:value2 这是一个三目运算符,当表达式 expre…

#三元运算符(python/java/c)

引入:什么是三元运算符呢?无疑其操作元有三个,一个是条件表达式,剩余两个为值,条件表达式为真时运算取第一个值,为假时取第二个值。 一 Python true_expression if condition else false_expressi…

网络通讯实验报告

拓扑图 需求 1、通过DHCP服务,给PC4和PC5分配IP地址、网关、掩码、DNS服务器IP地址 2、Client-1要求手工配置IP地址,为192.168.1.1, c 3、telnet客户端可以远程登录telnet服务器进行设备管理,并成功修改telnet服务器的名字为123 &#xff0c…

两轮差速拖动机械臂瞄准接收口目标

下图所示,关节2为无动力旋转关节,关节4为无动力移动关节,关节5为旋转关节,差速轮可绕轮中心点4自由旋转,差速轮带动2和4关节运动。设计差速轮和机械臂解算方法,使其相互配合到达接收口,瞄准目标…