Vision Transformer模型入门
Vision Transformer模型入门
- 一、Vision Transformer 模型
- 1,Embedding 层结构详解
- 2,Transformer Encoder 详解
- 3,MLP Head 详解
- 二、ViT-B/16 网络结构
- 三、Hybrid 模型详解
- 四、ViT 模型搭建参数
一、Vision Transformer 模型
总体三个模块:Embedding层、Transformer Encoder、MLP Head(分类层)
注:以下层结构讲解均以ViT-B/16为例
1,Embedding 层结构详解
Transformer 要求 token 向量,需要 Embedding 层做数据转换。将一张图根据给定大小分为一堆 patches。
例如 224 x 224 的图片按照 16 x 16 的 patch 划分,得到(224 / 16)² = 196 个 patches。接着将每个 patch 映射到一维向量,即每个 patch 的 shape [16,16,3] 通过映射得到一个长度为 768 的向量(即为Transformer 所需的 token 向量)。
代码实现:通过一个 16 x 16 的卷积核,步距 16,卷积个数 768 实现。shape [224,224,3] -> [14,14,768],再把 H 和 W 两个维度展平,[14,14,768] -> [196,768]
在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。
在刚刚得到的一堆 tokens 中插入一个专门用于分类的 [class]token,这个 [class]token 是一个可训练的参数,数据格式和其他 token 一样都是一个向量。以 ViT-B/16 为例,就是一个长度为768的向量,与之前从图片中生成的 tokens 拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。
关于 Position Embedding 就是 Transformer 中的 Positional Encoding,采用的是一个可训练的参数(1D Pos. Emb.),是直接叠加在 tokens 上的(add),所以 shape 要一样。以 ViT-B/16 为例,刚刚拼接 [class]token 后 shape 是 [197, 768],那么这里的 Position Embedding 的 shape 也是 [197, 768]。
2,Transformer Encoder 详解
Transformer Encoder 其实就是重复堆叠 Encoder Block L次,主要由以下几部分组成:
- Layer Norm:对每个 token 进行 Norm 处理(层归一化)
- Multi-Head Attention
- Dropout/DropPath
- MLP Block:全连接 + GELU 激活函数 + Dropout 组成,需要注意第一个全连接层会把输入节点个数翻 4 倍 [197, 768] -> [197, 3072],第二个全连接层会还原回原节点个数 [197, 3072] -> [197, 768]
注意:Transformer Encoder后还有一个 Layer Norm 没有画出来
3,MLP Head 详解
上面通过 Transformer Encoder 后输出的 shape 和输入的 shape 是保持不变的,以 ViT-B/16 为例,输入的是 [197, 768] 输出的还是 [197, 768]。
这里我们只需要分类信息,所以只需提取出 [class]token 生成的对应结果就行,即 [197, 768] 中抽取出 [class]token 对应的 [1, 768]。接着通过 MLP Head 得到最终的分类结果。
二、ViT-B/16 网络结构
三、Hybrid 模型详解
Hybrid 混合模型就是将传统 CNN 特征提取和 Transformer 进行结合。下图绘制的是以 ResNet50 作为特征提取器的混合模型。
但这里的 Resnet 与之前讲的 Resnet 有些不同。
- R50 的卷积层采用的 StdConv2d 而不是传统的 Conv2d
- 所有的 BatchNorm 层替换成 GroupNorm 层
- 在原 Resnet50 网络中,stage1 重复堆叠 3 次,stage2 重复堆叠 4 次,stage3 重复堆叠 6 次,stage4 重复堆叠 3 次,但在这里的R50 中,把 stage4 中的 3 个 Block 移至 stage3 中,所以 stage3 中共重复堆叠 9 次
通过 R50 Backbone 进行特征提取后,得到的特征矩阵 shape 是 [14, 14, 1024],接着再输入 Patch Embedding 层,注意Patch Embedding中卷积层 Conv2d 的 kernel_size 和 stride 都变成了 1,只是用来调整 channel。后面的部分和前面ViT中讲的完全一样。
四、ViT 模型搭建参数
下面给出三个模型(Base/ Large/ Huge)的参数,其中,
- Layers 就是 Transformer Encoder 中重复堆叠 Encoder Block 的次数
- Hidden Size 就是对应通过 Embedding 层后每个 token 的 dim(向量的长度)
- MLP size 是 Transformer Encoder 中 MLP Block 第一个全连接的节点个数(是 Hidden Size 的四倍)
- Heads 代表 Transformer 中 Multi-Head Attention 的 heads 数
Model | Patch Size | Layers | Hidden Size D | MLP size | Heads | Params |
---|---|---|---|---|---|---|
ViT-Base | 16x16 | 12 | 768 | 3072 | 12 | 86M |
ViT-Large | 16x16 | 24 | 1024 | 4096 | 16 | 307M |
ViT-Huge | 14x14 | 32 | 1280 | 5120 | 16 | 632M |
相关文章:

Vision Transformer模型入门
Vision Transformer模型入门 一、Vision Transformer 模型1,Embedding 层结构详解2,Transformer Encoder 详解3,MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…...
如何使用 Go 获取 URL 的参数,以及使用时的问题
Go 获取 URL 参数也很容易,但是由于 Go 有严格的数据类型和错误管理,所以在使用时会些微有些复杂。所以本文不仅会讲如何获取 URL 的参数,也会讲在使用时的一些问题。 首先假设 URL 是https://www.example.com/?keywordabc&id12。 其他…...
Linux驱动-基于QT控制LED灯
Linux驱动-基于QT控制LED灯 环境搭建LED驱动程序基于总线设备模型基于设备树 QT界面编程测试 环境搭建 平台 韦东山100ask imax6ull pro && 大象嵌入式开发板Build Root 使用Build root编译image,具体配置可参考《嵌入式Linux应用开发完全手册-IMX6ULL开发…...
布隆过滤器的原理和应用场景
目录 1 原理 2 代码示例 3 位数组 4 布隆过滤器的实际应用场景 1 原理 布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否存在于一个集合中,具有高效的插入和查询操作。它的设计目的是在空间效率和查询效率之…...

ElasticSearch学习
一,简介 ES(elaticsearch简写), Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据…...
软件测试基础篇——Redis
Redis Redis数据库的配置与连接 解压redis数据库的安装包(建议把解压后的安装包放到磁盘的根目录,方便访问操作)打开【命令行窗口】:winR在命令行窗口,进入到redis安装目录中 格式一:cd /d redis目录…...

大数据扫盲(1): 数据仓库与ETL的关系及ETL工具推荐
在数字化时代,数据成为了企业决策的关键支持。然而,随着数据不断增长,有效地管理和利用这些数据变得至关重要。数据仓库和ETL工具作为数据管理和分析的核心,将帮助企业从庞杂的数据中提取有价值信息。 一、ETL是什么? …...

spring的aop动态代理对象注入时机
bean生命周期: bean实例化populateBean填充属性invokeAwareMethods调用aware方法postProcessBeforeInitialization后置处理器before方法initializeBean初始化beanpostProcessAfterAfterInitialization后置处理器after方法 代理对象注入有两种情况:提前和…...

idea集成svn
一、注意 安装svn客户端的时候一定要勾选,否则在idea上集成svn的时候会找不到 svn.exe 而报错。 如果当初安装时忘记勾选,重新运行安装包,选择modify,勾选command line client tools项中的内容。 二、配置idea集成svn 三、检出(c…...

RedisDesktopManage
RDM 简介下载安装 简介 RedisDesktopManager(RDM)是一个开源的跨平台图形界面工具,用于管理和操作 Redis 数据库。它提供了一个用户友好的界面,使用户能够轻松地连接、浏览、查询和修改 Redis 数据,而无需使用命令行界…...

《Vue.js实战》——基础篇(1)
目录 资源:🌟 一、初识Vue.js👋 Vue.js是什么?🙇 MVVM模式 ✍ Vue.js有什么不同 ☔ 如何使用Vue.js? ☁ 传统的前端开发模式 ☀ Vue.js的开发模式 🗻 二、数据绑定和第一个Vue应用 Ὗ…...

R语言 列表中嵌套列名一致的多个数据框如何整合为一个数据框
在批量建模后容易得到list,list中的每个元素都是单个的tibble 或者 dataframe,如何将这些数据整合为一张表呢? 载入R包 library(broom) library(tidyverse) 模拟数据 models <- txhousing %>% group_by(city) %>% do(modlm(lo…...

PyQt5利用QTextEdit控件输入多行文本
1、总代码 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication,QWidget from PyQt5 import QtCore, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(320, 240)s…...

【数据结构】二叉树常见题目
文章目录 前言二叉树概念满二叉树完全二叉树二叉搜索树(二叉排序树)平衡⼆叉搜索树存储⽅式 二叉树OJ二叉树创建字符串二叉树的分层遍历1二叉树的分层遍历2给定一个二叉树, 找到该树中两个指定节点的最近公共祖先二叉树搜索树转换成排序双向链表二叉树展开为链表根据一棵树的前…...

树莓派使用 ENC28J60
前言 一些老的、Mini 的 ARM 开发板上没有预留网口,这样在调试升级内核或应用程序时很不方便。纵使有串口下载工具,但其速度也是慢地捉急。这种情况下,使用其它接口来扩展出一个网口无疑是一个比较好的方法。 ENC28J60 就是一个使用 SPI 接口…...
跟我学C++中级篇——模板友元的应用
一、友元 友元在以前分析过,而且一般编程是不推荐使用友元的,原因是友元破坏了类的封装性。但凡事总有例外,在某些情况下,用友元还是比较方便的,那么该用还得用,不能因噎废食。普通的友元,各种…...

软件测试基础篇——MySQL
MySQL 1、数据库技术概述 数据库database:存放和管理各种数据的仓库,操作的对象主要是【数据data】,科学的组织和存储数据,高效的获取和处理数据SQL:结构化查询语言,专为**关系型数据库而建立的操作语言&…...

FreeRTOS(二值信号量)
资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量的定义与应用 1、二值信号量的定义 2、二值信号量的应用 三、二值信号量的运作机制 1、FreeRTOS任务间二值…...
leetcode面试题:动物收容所(考查对队列的理解和运用)
题目: 有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时…...

【Linux命令行与Shell脚本编程】第十八章 文本处理与编辑器基础
Linux命令行与Shell脚本编程 第十八章 文本处理与编辑器基础 文章目录 Linux命令行与Shell脚本编程第十八章 文本处理与编辑器基础 文本处理与编辑器基础8.1.文本处理8.1.1.sed编辑器8.1.1.1.在命令行中定义编辑器命令8.1.1.2.在命令行中使用多个编辑器命令8.1.1.3.从文件中读…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...