VIT(vision transformer)onnx模型解析
背景:transformer在CV领域的应用
论文下载链接:https://arxiv.org/abs/2010.11929
Pytorch实现代码: pytorch_classification/vision_transformer(太阳花的小绿豆博主实现的代码)
有一些大神在研究关于CNN+transformer或者纯用transformer实现。
原文的摘要说"We show that this reliance on CNNs is not necessary and a pure transformer applied directly to sequences of image patches can perform very well on image classification tasks."(我们展示,这种对 CNN 的依赖是不必要的,直接应用于图像块序列的纯变换器可以很好地执行图像分类任务)
比较具体的内容请看太阳花的小绿豆博主的《Vision Transformer详解》,相关的图片是这个博主的,我这里直接用ONNX的模型结构进行说明,可能更加直观一点(不喜勿碰哈)
VIT整体结构图


VIT形状变化
pytorch的api:summary(model, (3, 224, 224))----------------------------------------------------------------Layer (type) Output Shape Param #
================================================================
(1) 前处理Conv2d-1 [-1, 768, 14, 14] 590,592Identity-2 [-1, 196, 768] 0PatchEmbed-3 [-1, 196, 768] 0Dropout-4 [-1, 197, 768] 0
(2) transformer encoderblock 1LayerNorm-5 [-1, 197, 768] 1,536Linear-6 [-1, 197, 2304] 1,771,776Dropout-7 [-1, 12, 197, 197] 0Linear-8 [-1, 197, 768] 590,592Dropout-9 [-1, 197, 768] 0Attention-10 [-1, 197, 768] 0Identity-11 [-1, 197, 768] 0LayerNorm-12 [-1, 197, 768] 1,536Linear-13 [-1, 197, 3072] 2,362,368GELU-14 [-1, 197, 3072] 0Dropout-15 [-1, 197, 3072] 0Linear-16 [-1, 197, 768] 2,360,064Dropout-17 [-1, 197, 768] 0Mlp-18 [-1, 197, 768] 0Identity-19 [-1, 197, 768] 0Block-20 [-1, 197, 768] 0
block 2LayerNorm-21 [-1, 197, 768] 1,536Linear-22 [-1, 197, 2304] 1,771,776Dropout-23 [-1, 12, 197, 197] 0Linear-24 [-1, 197, 768] 590,592Dropout-25 [-1, 197, 768] 0Attention-26 [-1, 197, 768] 0Identity-27 [-1, 197, 768] 0LayerNorm-28 [-1, 197, 768] 1,536Linear-29 [-1, 197, 3072] 2,362,368GELU-30 [-1, 197, 3072] 0Dropout-31 [-1, 197, 3072] 0Linear-32 [-1, 197, 768] 2,360,064Dropout-33 [-1, 197, 768] 0Mlp-34 [-1, 197, 768] 0Identity-35 [-1, 197, 768] 0Block-36 [-1, 197, 768] 0
block 3LayerNorm-37 [-1, 197, 768] 1,536Linear-38 [-1, 197, 2304] 1,771,776Dropout-39 [-1, 12, 197, 197] 0Linear-40 [-1, 197, 768] 590,592Dropout-41 [-1, 197, 768] 0Attention-42 [-1, 197, 768] 0Identity-43 [-1, 197, 768] 0LayerNorm-44 [-1, 197, 768] 1,536Linear-45 [-1, 197, 3072] 2,362,368GELU-46 [-1, 197, 3072] 0Dropout-47 [-1, 197, 3072] 0Linear-48 [-1, 197, 768] 2,360,064Dropout-49 [-1, 197, 768] 0Mlp-50 [-1, 197, 768] 0Identity-51 [-1, 197, 768] 0Block-52 [-1, 197, 768] 0
block 4LayerNorm-53 [-1, 197, 768] 1,536Linear-54 [-1, 197, 2304] 1,771,776Dropout-55 [-1, 12, 197, 197] 0Linear-56 [-1, 197, 768] 590,592Dropout-57 [-1, 197, 768] 0Attention-58 [-1, 197, 768] 0Identity-59 [-1, 197, 768] 0LayerNorm-60 [-1, 197, 768] 1,536Linear-61 [-1, 197, 3072] 2,362,368GELU-62 [-1, 197, 3072] 0Dropout-63 [-1, 197, 3072] 0Linear-64 [-1, 197, 768] 2,360,064Dropout-65 [-1, 197, 768] 0Mlp-66 [-1, 197, 768] 0Identity-67 [-1, 197, 768] 0Block-68 [-1, 197, 768] 0
block 5LayerNorm-69 [-1, 197, 768] 1,536Linear-70 [-1, 197, 2304] 1,771,776Dropout-71 [-1, 12, 197, 197] 0Linear-72 [-1, 197, 768] 590,592Dropout-73 [-1, 197, 768] 0Attention-74 [-1, 197, 768] 0Identity-75 [-1, 197, 768] 0LayerNorm-76 [-1, 197, 768] 1,536Linear-77 [-1, 197, 3072] 2,362,368GELU-78 [-1, 197, 3072] 0Dropout-79 [-1, 197, 3072] 0Linear-80 [-1, 197, 768] 2,360,064Dropout-81 [-1, 197, 768] 0Mlp-82 [-1, 197, 768] 0Identity-83 [-1, 197, 768] 0Block-84 [-1, 197, 768] 0
block 6LayerNorm-85 [-1, 197, 768] 1,536Linear-86 [-1, 197, 2304] 1,771,776Dropout-87 [-1, 12, 197, 197] 0Linear-88 [-1, 197, 768] 590,592Dropout-89 [-1, 197, 768] 0Attention-90 [-1, 197, 768] 0Identity-91 [-1, 197, 768] 0LayerNorm-92 [-1, 197, 768] 1,536Linear-93 [-1, 197, 3072] 2,362,368GELU-94 [-1, 197, 3072] 0Dropout-95 [-1, 197, 3072] 0Linear-96 [-1, 197, 768] 2,360,064Dropout-97 [-1, 197, 768] 0Mlp-98 [-1, 197, 768] 0Identity-99 [-1, 197, 768] 0Block-100 [-1, 197, 768] 0
block 7LayerNorm-101 [-1, 197, 768] 1,536Linear-102 [-1, 197, 2304] 1,771,776Dropout-103 [-1, 12, 197, 197] 0Linear-104 [-1, 197, 768] 590,592Dropout-105 [-1, 197, 768] 0Attention-106 [-1, 197, 768] 0Identity-107 [-1, 197, 768] 0LayerNorm-108 [-1, 197, 768] 1,536Linear-109 [-1, 197, 3072] 2,362,368GELU-110 [-1, 197, 3072] 0Dropout-111 [-1, 197, 3072] 0Linear-112 [-1, 197, 768] 2,360,064Dropout-113 [-1, 197, 768] 0Mlp-114 [-1, 197, 768] 0Identity-115 [-1, 197, 768] 0Block-116 [-1, 197, 768] 0
block 8LayerNorm-117 [-1, 197, 768] 1,536Linear-118 [-1, 197, 2304] 1,771,776Dropout-119 [-1, 12, 197, 197] 0Linear-120 [-1, 197, 768] 590,592Dropout-121 [-1, 197, 768] 0Attention-122 [-1, 197, 768] 0Identity-123 [-1, 197, 768] 0LayerNorm-124 [-1, 197, 768] 1,536Linear-125 [-1, 197, 3072] 2,362,368GELU-126 [-1, 197, 3072] 0Dropout-127 [-1, 197, 3072] 0Linear-128 [-1, 197, 768] 2,360,064Dropout-129 [-1, 197, 768] 0Mlp-130 [-1, 197, 768] 0Identity-131 [-1, 197, 768] 0Block-132 [-1, 197, 768] 0
block 9LayerNorm-133 [-1, 197, 768] 1,536Linear-134 [-1, 197, 2304] 1,771,776Dropout-135 [-1, 12, 197, 197] 0Linear-136 [-1, 197, 768] 590,592Dropout-137 [-1, 197, 768] 0Attention-138 [-1, 197, 768] 0Identity-139 [-1, 197, 768] 0LayerNorm-140 [-1, 197, 768] 1,536Linear-141 [-1, 197, 3072] 2,362,368GELU-142 [-1, 197, 3072] 0Dropout-143 [-1, 197, 3072] 0Linear-144 [-1, 197, 768] 2,360,064Dropout-145 [-1, 197, 768] 0Mlp-146 [-1, 197, 768] 0Identity-147 [-1, 197, 768] 0Block-148 [-1, 197, 768] 0
block 10LayerNorm-149 [-1, 197, 768] 1,536Linear-150 [-1, 197, 2304] 1,771,776Dropout-151 [-1, 12, 197, 197] 0Linear-152 [-1, 197, 768] 590,592Dropout-153 [-1, 197, 768] 0Attention-154 [-1, 197, 768] 0Identity-155 [-1, 197, 768] 0LayerNorm-156 [-1, 197, 768] 1,536Linear-157 [-1, 197, 3072] 2,362,368GELU-158 [-1, 197, 3072] 0Dropout-159 [-1, 197, 3072] 0Linear-160 [-1, 197, 768] 2,360,064Dropout-161 [-1, 197, 768] 0Mlp-162 [-1, 197, 768] 0Identity-163 [-1, 197, 768] 0Block-164 [-1, 197, 768] 0
block 11LayerNorm-165 [-1, 197, 768] 1,536Linear-166 [-1, 197, 2304] 1,771,776Dropout-167 [-1, 12, 197, 197] 0Linear-168 [-1, 197, 768] 590,592Dropout-169 [-1, 197, 768] 0Attention-170 [-1, 197, 768] 0Identity-171 [-1, 197, 768] 0LayerNorm-172 [-1, 197, 768] 1,536Linear-173 [-1, 197, 3072] 2,362,368GELU-174 [-1, 197, 3072] 0Dropout-175 [-1, 197, 3072] 0Linear-176 [-1, 197, 768] 2,360,064Dropout-177 [-1, 197, 768] 0Mlp-178 [-1, 197, 768] 0Identity-179 [-1, 197, 768] 0Block-180 [-1, 197, 768] 0
block 12LayerNorm-181 [-1, 197, 768] 1,536Linear-182 [-1, 197, 2304] 1,771,776Dropout-183 [-1, 12, 197, 197] 0Linear-184 [-1, 197, 768] 590,592Dropout-185 [-1, 197, 768] 0Attention-186 [-1, 197, 768] 0Identity-187 [-1, 197, 768] 0LayerNorm-188 [-1, 197, 768] 1,536Linear-189 [-1, 197, 3072] 2,362,368GELU-190 [-1, 197, 3072] 0Dropout-191 [-1, 197, 3072] 0Linear-192 [-1, 197, 768] 2,360,064Dropout-193 [-1, 197, 768] 0Mlp-194 [-1, 197, 768] 0Identity-195 [-1, 197, 768] 0Block-196 [-1, 197, 768] 0
(3)后处理LayerNorm-197 [-1, 197, 768] 1,536Identity-198 [-1, 768] 0Linear-199 [-1, 5] 3,845
================================================================
Total params: 85,650,437
Trainable params: 85,650,437
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 408.54
Params size (MB): 326.73
Estimated Total Size (MB): 735.84
----------------------------------------------------------------3. 数据前处理
3*224*224经过768个16*16的卷积,输出768*14*14
将输出flatten,768*196(14*14)
调整通道196*768
添加class_num(分类信息)1*768,拼接196*768成197*768
添加位置信息pos,add(shape还是197*768)

4.数据输入到transformer encoder的onnx结构图
关于ONNX里面的op,说实话,有点hold不住,layernorm层搞得很复杂,融合暂时还没有看(后续会研究的,暂时没有时间),反正这个就是transformer encoder(我不管,这个就是)
LayerNorm-5 [-1, 197, 768]
Linear-6 [-1, 197, 2304]
Dropout-7 [-1, 12, 197, 197]
Linear-8 [-1, 197, 768]
Dropout-9 [-1, 197, 768]
Attention-10 [-1, 197, 768]
Identity-11 [-1, 197, 768]
LayerNorm-12 [-1, 197, 768]
Linear-13 [-1, 197, 3072]
GELU-14 [-1, 197, 3072]
Dropout-15 [-1, 197, 3072]
Linear-16 [-1, 197, 768]
Dropout-17 [-1, 197, 768]
Mlp-18 [-1, 197, 768]
Identity-19 [-1, 197, 768]
Block-20 [-1, 197, 768]

5.后处理
LayerNorm-197 [-1, 197, 768]
Identity-198 [-1, 768]
Linear-199 [-1, 5]
那 ,你看,这就是layernorm的op操作(不忍吐槽)

最后接上全连接层,输出结果

总结
其实从OP来看,VIT并没有添加新的算子,只是一些层的拼接,但是效果却是很好,真的,朴实无华的结构,做着深奥的内容,哎,继续学习吧,学无止境!!!相关的ONNX代码,感兴趣的读者多的话,后续可以上传,供大家试用,请关注或者评论(⊙o⊙)哦!!!

class: daisy prob: 0.995
class: dandelion prob: 0.00298
class: roses prob: 0.000599
class: sunflowers prob: 0.000633
class: tulips prob: 0.000771
相关文章:
VIT(vision transformer)onnx模型解析
背景:transformer在CV领域的应用论文下载链接:https://arxiv.org/abs/2010.11929Pytorch实现代码: pytorch_classification/vision_transformer(太阳花的小绿豆博主实现的代码)有一些大神在研究关于CNNtransformer或者纯用transformer实现。原…...
红黑树的介绍和实现
文章目录1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入1.5 红黑树的验证1.6 红黑树与AVL树的比较1. 红黑树 1.1 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以…...
C/C++每日一练(20230310)
目录 1. 用栈实现队列 ★★ 2. 单词搜索 II ★★★ 3. 直线上最多的点数 ★★★ 1. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: v…...
Go语言基础知识
常量//定义方式 const a int12;//指定变量类型 const b12;//不指定变量类型,由编译时go自动确认 const(//多行定义方式a12b23 ) //说到const,不得不得不提到的一个参数iota,初始值为0,在用const多行定义的方式中, 如果第一行定义了…...
案例06-没有复用思想的接口和sql--mybatis,spring
目录一、背景二、思路&方案问题1优化问题2优化三、总结四、升华一、背景 写这篇文章的目的是通过对没有复用思想接口的代码例子优化告诉大家,没有复用思想的代码不要写,用这种思维方式和习惯来指导我们写代码。 项目中有两处没有复用思想代码&#…...
如何将项目部署到服务器:从选择服务器到维护应用程序的全流程指南
将项目部署到服务器是一个重要的技能,对于开发人员来说,它是必不可少的。在本文中,我将介绍一些关于如何将项目部署到服务器的最佳实践。一、选择服务器在部署项目之前,你需要先选择一个适合你的服务器。如果你已经有一个可用的服…...
怎么做才能不丢消息?
现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,可以做到在消息传递的过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递、不丢消息。 绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用…...
前端基础(十六)_数组对象
数组对象 1、创建数组 // 字面量创建const arr [1, 2, 3, 4, 5, 6]// 构造函数创建const arr2 new Array(1, 2, 3, 4, 5, 6)const arr3 Array(1, 2, 3, 4, 5, 6)2.push (从数组末尾添加元素) a.数组.push(要添加进数组的数组项) b.作用:将要添加的数组项 添加到…...
数据结构-带头双向循环链表
前言: 链表有很多种,上一章结,我复盘了单链表,这一章节,主要针对双链表的知识点进行,整理复盘,如果将链表分类的话,有很多种,我就学习的方向考察的重点,主要…...
3 问 6 步,极狐GitLab 帮助企业构建高效、安全、合规的 DevSecOps 文化
本文来源:about.gitlab.com 作者:Vanessa Wegner 译者:极狐(GitLab) 市场部内容团队 🔒 安全为何重要?此前,我们分享了: 1. 2023年DevOps发展趋势👉重磅!GitLab 提出五大…...
SPA(单页应用)知多少
单页面应用程序将所有的活动局限于一个Web页面中,在该Web页面初始化时加载相应的HTML、JavaScript 和 CSS。一旦页面加载完成,单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用 JavaScript 动态的变换HTML的内容,从…...
Selenium实战【远程控制】【JAVA爬虫】
简介 Selenium RemoteWebDriver是Selenium WebDriver的一个扩展,它可以将测试运行在远程机器上的浏览器中。 使用RemoteWebDriver,可以在本地机器上编写测试脚本,然后将测试请求发送到远程机器上的浏览器中执行。这使得测试可以在多个不同的机器上并行运行,从而加快测试的…...
图片动画化应用中的动作分解方法
作者 | FesianXu 前言 最近基于AI的换脸应用非常的火爆,同时也引起了新一轮的网络伦理大讨论。如果光从技术的角度看,对于视频中的人体动作信息,通常可以通过泰勒展开分解成零阶运动信息与一阶运动信息,如文献[1,2]中提到的&…...
我又和redis超时杠上了
背景 经过上次redis超时排查,并联系云服务商解决之后,redis超时的现象好了一阵子,但是最近又有超时现象报出,但与上次不同的是,这次超时的现象发生在业务高峰期,在简单看过服务器的各项指标以后࿰…...
一文带你吃透MySQL数据库!
文章目录1. 索引2. 事务3. 存储引擎4. 锁机制5. MySQL其他知识点文章字数大约1.27万字,阅读大概需要42分钟,建议收藏后慢慢阅读!!!1. 索引 为什么使用索引 通过创建唯一性索引,可以保证数据库表中每一行数据…...
[学习笔记] 2. 数据结构
数据结构视频地址:https://www.bilibili.com/video/BV1uA411N7c5 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字…...
[学习笔记] 3. 算法进阶
算法进阶视频地址:https://www.bilibili.com/video/BV1uA411N7c5 1. 贪心算法 贪心算法(又称贪婪算法),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑 —— 所做…...
做自媒体真的能赚到钱吗?真的能赚到几十万吗?
自媒体在当今社会已经成为一个热门话题,越来越多的人开始尝试做自媒体,希望能够通过自媒体赚到钱。但是,做自媒体真的能赚到钱吗?能赚到几十万吗?下面我们来一一解答。 首先,做自媒体确实可以赚到钱。随着互…...
QT使用QListWidget显示多张图片
Qt系列文章目录 文章目录Qt系列文章目录前言一、QListWidget 和 QListView 的差异二、显示效果1.操作工作区界面1.主界面头文件2. 主界面实现界面2.左边图片目录展示界面1.图片目录头文件2.图片目录实现文件2.属性窗口区1.属性窗口头文件2.属性窗口实现文件3 源码下载前言 QLi…...
python 打印进度条
import time recv_size0 total_size1024while recv_size < total_size:time.sleep(0.1)recv_size1024#打印进度条percentrecv_size / total_sizeres int(50 * percent) * #print(\r[%-50s] %d%% % (res,int(100 * percent)),end) # end 打印以‘’结尾,打印% 需…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...
信息系统分析与设计复习
2024试卷 单选题(20) 1、在一个聊天系统(类似ChatGPT)中,属于控制类的是()。 A. 话语者类 B.聊天文字输入界面类 C. 聊天主题辨别类 D. 聊天历史类 解析 B-C-E备选架构中分析类分为边界类、控制类和实体类。 边界…...
Go爬虫开发学习记录
Go爬虫开发学习记录 基础篇:使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能,是构建爬虫的基石: package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...
