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.从文件中读…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
