VIT(vision transformer)onnx模型解析

news2024/9/23 13:31:04

背景: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的模型结构进行说明,可能更加直观一点(不喜勿碰哈)

  1. VIT整体结构图

  1. VIT形状变化

pytorch的api:summary(model, (3, 224, 224))

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
(1) 前处理
            Conv2d-1          [-1, 768, 14, 14]         590,592
          Identity-2             [-1, 196, 768]               0
        PatchEmbed-3             [-1, 196, 768]               0
           Dropout-4             [-1, 197, 768]               0
(2) transformer encoder

block 1
         LayerNorm-5             [-1, 197, 768]           1,536
            Linear-6            [-1, 197, 2304]       1,771,776
           Dropout-7         [-1, 12, 197, 197]               0
            Linear-8             [-1, 197, 768]         590,592
           Dropout-9             [-1, 197, 768]               0
        Attention-10             [-1, 197, 768]               0
         Identity-11             [-1, 197, 768]               0
        LayerNorm-12             [-1, 197, 768]           1,536
           Linear-13            [-1, 197, 3072]       2,362,368
             GELU-14            [-1, 197, 3072]               0
          Dropout-15            [-1, 197, 3072]               0
           Linear-16             [-1, 197, 768]       2,360,064
          Dropout-17             [-1, 197, 768]               0
              Mlp-18             [-1, 197, 768]               0
         Identity-19             [-1, 197, 768]               0
            Block-20             [-1, 197, 768]               0
block 2
        LayerNorm-21             [-1, 197, 768]           1,536
           Linear-22            [-1, 197, 2304]       1,771,776
          Dropout-23         [-1, 12, 197, 197]               0
           Linear-24             [-1, 197, 768]         590,592
          Dropout-25             [-1, 197, 768]               0
        Attention-26             [-1, 197, 768]               0
         Identity-27             [-1, 197, 768]               0
        LayerNorm-28             [-1, 197, 768]           1,536
           Linear-29            [-1, 197, 3072]       2,362,368
             GELU-30            [-1, 197, 3072]               0
          Dropout-31            [-1, 197, 3072]               0
           Linear-32             [-1, 197, 768]       2,360,064
          Dropout-33             [-1, 197, 768]               0
              Mlp-34             [-1, 197, 768]               0
         Identity-35             [-1, 197, 768]               0
            Block-36             [-1, 197, 768]               0
block 3
        LayerNorm-37             [-1, 197, 768]           1,536
           Linear-38            [-1, 197, 2304]       1,771,776
          Dropout-39         [-1, 12, 197, 197]               0
           Linear-40             [-1, 197, 768]         590,592
          Dropout-41             [-1, 197, 768]               0
        Attention-42             [-1, 197, 768]               0
         Identity-43             [-1, 197, 768]               0
        LayerNorm-44             [-1, 197, 768]           1,536
           Linear-45            [-1, 197, 3072]       2,362,368
             GELU-46            [-1, 197, 3072]               0
          Dropout-47            [-1, 197, 3072]               0
           Linear-48             [-1, 197, 768]       2,360,064
          Dropout-49             [-1, 197, 768]               0
              Mlp-50             [-1, 197, 768]               0
         Identity-51             [-1, 197, 768]               0
            Block-52             [-1, 197, 768]               0
block 4
        LayerNorm-53             [-1, 197, 768]           1,536
           Linear-54            [-1, 197, 2304]       1,771,776
          Dropout-55         [-1, 12, 197, 197]               0
           Linear-56             [-1, 197, 768]         590,592
          Dropout-57             [-1, 197, 768]               0
        Attention-58             [-1, 197, 768]               0
         Identity-59             [-1, 197, 768]               0
        LayerNorm-60             [-1, 197, 768]           1,536
           Linear-61            [-1, 197, 3072]       2,362,368
             GELU-62            [-1, 197, 3072]               0
          Dropout-63            [-1, 197, 3072]               0
           Linear-64             [-1, 197, 768]       2,360,064
          Dropout-65             [-1, 197, 768]               0
              Mlp-66             [-1, 197, 768]               0
         Identity-67             [-1, 197, 768]               0
            Block-68             [-1, 197, 768]               0
block 5
        LayerNorm-69             [-1, 197, 768]           1,536
           Linear-70            [-1, 197, 2304]       1,771,776
          Dropout-71         [-1, 12, 197, 197]               0
           Linear-72             [-1, 197, 768]         590,592
          Dropout-73             [-1, 197, 768]               0
        Attention-74             [-1, 197, 768]               0
         Identity-75             [-1, 197, 768]               0
        LayerNorm-76             [-1, 197, 768]           1,536
           Linear-77            [-1, 197, 3072]       2,362,368
             GELU-78            [-1, 197, 3072]               0
          Dropout-79            [-1, 197, 3072]               0
           Linear-80             [-1, 197, 768]       2,360,064
          Dropout-81             [-1, 197, 768]               0
              Mlp-82             [-1, 197, 768]               0
         Identity-83             [-1, 197, 768]               0
            Block-84             [-1, 197, 768]               0
block 6
        LayerNorm-85             [-1, 197, 768]           1,536
           Linear-86            [-1, 197, 2304]       1,771,776
          Dropout-87         [-1, 12, 197, 197]               0
           Linear-88             [-1, 197, 768]         590,592
          Dropout-89             [-1, 197, 768]               0
        Attention-90             [-1, 197, 768]               0
         Identity-91             [-1, 197, 768]               0
        LayerNorm-92             [-1, 197, 768]           1,536
           Linear-93            [-1, 197, 3072]       2,362,368
             GELU-94            [-1, 197, 3072]               0
          Dropout-95            [-1, 197, 3072]               0
           Linear-96             [-1, 197, 768]       2,360,064
          Dropout-97             [-1, 197, 768]               0
              Mlp-98             [-1, 197, 768]               0
         Identity-99             [-1, 197, 768]               0
           Block-100             [-1, 197, 768]               0
block 7
       LayerNorm-101             [-1, 197, 768]           1,536
          Linear-102            [-1, 197, 2304]       1,771,776
         Dropout-103         [-1, 12, 197, 197]               0
          Linear-104             [-1, 197, 768]         590,592
         Dropout-105             [-1, 197, 768]               0
       Attention-106             [-1, 197, 768]               0
        Identity-107             [-1, 197, 768]               0
       LayerNorm-108             [-1, 197, 768]           1,536
          Linear-109            [-1, 197, 3072]       2,362,368
            GELU-110            [-1, 197, 3072]               0
         Dropout-111            [-1, 197, 3072]               0
          Linear-112             [-1, 197, 768]       2,360,064
         Dropout-113             [-1, 197, 768]               0
             Mlp-114             [-1, 197, 768]               0
        Identity-115             [-1, 197, 768]               0
           Block-116             [-1, 197, 768]               0
block 8
       LayerNorm-117             [-1, 197, 768]           1,536
          Linear-118            [-1, 197, 2304]       1,771,776
         Dropout-119         [-1, 12, 197, 197]               0
          Linear-120             [-1, 197, 768]         590,592
         Dropout-121             [-1, 197, 768]               0
       Attention-122             [-1, 197, 768]               0
        Identity-123             [-1, 197, 768]               0
       LayerNorm-124             [-1, 197, 768]           1,536
          Linear-125            [-1, 197, 3072]       2,362,368
            GELU-126            [-1, 197, 3072]               0
         Dropout-127            [-1, 197, 3072]               0
          Linear-128             [-1, 197, 768]       2,360,064
         Dropout-129             [-1, 197, 768]               0
             Mlp-130             [-1, 197, 768]               0
        Identity-131             [-1, 197, 768]               0
           Block-132             [-1, 197, 768]               0
block 9
       LayerNorm-133             [-1, 197, 768]           1,536
          Linear-134            [-1, 197, 2304]       1,771,776
         Dropout-135         [-1, 12, 197, 197]               0
          Linear-136             [-1, 197, 768]         590,592
         Dropout-137             [-1, 197, 768]               0
       Attention-138             [-1, 197, 768]               0
        Identity-139             [-1, 197, 768]               0
       LayerNorm-140             [-1, 197, 768]           1,536
          Linear-141            [-1, 197, 3072]       2,362,368
            GELU-142            [-1, 197, 3072]               0
         Dropout-143            [-1, 197, 3072]               0
          Linear-144             [-1, 197, 768]       2,360,064
         Dropout-145             [-1, 197, 768]               0
             Mlp-146             [-1, 197, 768]               0
        Identity-147             [-1, 197, 768]               0
           Block-148             [-1, 197, 768]               0
block 10
       LayerNorm-149             [-1, 197, 768]           1,536
          Linear-150            [-1, 197, 2304]       1,771,776
         Dropout-151         [-1, 12, 197, 197]               0
          Linear-152             [-1, 197, 768]         590,592
         Dropout-153             [-1, 197, 768]               0
       Attention-154             [-1, 197, 768]               0
        Identity-155             [-1, 197, 768]               0
       LayerNorm-156             [-1, 197, 768]           1,536
          Linear-157            [-1, 197, 3072]       2,362,368
            GELU-158            [-1, 197, 3072]               0
         Dropout-159            [-1, 197, 3072]               0
          Linear-160             [-1, 197, 768]       2,360,064
         Dropout-161             [-1, 197, 768]               0
             Mlp-162             [-1, 197, 768]               0
        Identity-163             [-1, 197, 768]               0
           Block-164             [-1, 197, 768]               0
block 11
       LayerNorm-165             [-1, 197, 768]           1,536
          Linear-166            [-1, 197, 2304]       1,771,776
         Dropout-167         [-1, 12, 197, 197]               0
          Linear-168             [-1, 197, 768]         590,592
         Dropout-169             [-1, 197, 768]               0
       Attention-170             [-1, 197, 768]               0
        Identity-171             [-1, 197, 768]               0
       LayerNorm-172             [-1, 197, 768]           1,536
          Linear-173            [-1, 197, 3072]       2,362,368
            GELU-174            [-1, 197, 3072]               0
         Dropout-175            [-1, 197, 3072]               0
          Linear-176             [-1, 197, 768]       2,360,064
         Dropout-177             [-1, 197, 768]               0
             Mlp-178             [-1, 197, 768]               0
        Identity-179             [-1, 197, 768]               0
           Block-180             [-1, 197, 768]               0
block 12
       LayerNorm-181             [-1, 197, 768]           1,536
          Linear-182            [-1, 197, 2304]       1,771,776
         Dropout-183         [-1, 12, 197, 197]               0
          Linear-184             [-1, 197, 768]         590,592
         Dropout-185             [-1, 197, 768]               0
       Attention-186             [-1, 197, 768]               0
        Identity-187             [-1, 197, 768]               0
       LayerNorm-188             [-1, 197, 768]           1,536
          Linear-189            [-1, 197, 3072]       2,362,368
            GELU-190            [-1, 197, 3072]               0
         Dropout-191            [-1, 197, 3072]               0
          Linear-192             [-1, 197, 768]       2,360,064
         Dropout-193             [-1, 197, 768]               0
             Mlp-194             [-1, 197, 768]               0
        Identity-195             [-1, 197, 768]               0
           Block-196             [-1, 197, 768]               0
(3)后处理
       LayerNorm-197             [-1, 197, 768]           1,536
        Identity-198                  [-1, 768]               0
          Linear-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. 数据前处理

  1. 3*224*224经过768个16*16的卷积,输出768*14*14

  1. 将输出flatten,768*196(14*14)

  1. 调整通道196*768

  1. 添加class_num(分类信息)1*768,拼接196*768成197*768

  1. 添加位置信息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

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

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

相关文章

北邮22信通:你是不是在looking for……那串代码?(2)第三章单链表

相信有了第二章顺序表的基础,小伙伴们学习第三章链表应该会轻松一点吧 目录 类模板下的单链表 1.1书上干净完整代码(无增改、适合自己动手实验) 1.2对书上代码的完善和对一些问题的验证和解释代码 1.补全一个函数: 2.this指…

荧光染料IR 825叠氮IR825 N3,IR-825 azide,IR-825叠氮 科研试剂

产品描述:IR-825 N3含有叠氮基团,IR-825是一种近红外染料(NIR),IR-825在封装成纳米颗粒后,可能用于cancer光热和光动力 。叠氮化物基团可以参与铜催化的与炔部分的点击化学反应。西安凯新生物科技有限公司近…

基于多任务融合的圣女果采摘识别算法研究

基于多任务融合的圣女果采摘识别算法研究 1、简介 本文主要解决圣女果生产销售环节中,现有的流程是采摘成熟的圣女果,再对采摘下的果实进行单独的品质分级,不仅费时费力,而且多增加一个环节,也增加了对果实的二次伤害…

Oracle 19c之RPM安装

19c的RPM包下载链接, https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html 可以看到,19c开始支持企业版本的RPM,容量是2.5GB, 使用手工方式,通过RPM安装19c数据库,只需要两步操…

汽车零部件行业MES解决方案,实现生产全过程监控

行业背景 汽车汽配行业是中国国民经济的支柱产业,涉及的工艺包括压铸、冲压、注塑、机加、焊接、电子、喷涂、电镀、热处理、检测、装配等。 公安部数据显示,平均每百户家庭拥有汽车达到60辆。广阔的市场为行业带来大量需求的同时也带来了激烈的市场竞…

【Linux】网络入门

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…

栈和队列详细讲解+算法动画

栈和队列 栈stack 栈也是一种线性结构相比数组,栈对应的操作数数组的子集只能从一端添加元素,也只能从一端取出元素这一端称为栈顶 栈是一种后进先出的数据结构Last in Firt out(LIFO)在计算机的世界里,栈拥有者不可思议的作用 栈的应用 …

设计UI - Adobe xd对象介绍

矩形工具 新建矩形 操作步骤:选择矩形工具,快捷键R,鼠标在画板上拖出矩形即可。 拖动定界框周围圆形手柄,可快速调整矩形大小,也可以输入宽和高的参数对矩形大小进行改变。 移动矩形 操作步骤:选择选择工具…

AWS-解析mysql binlog同步数据方案

虽然是公有云的鼻祖,AWS在某些产品的实现却太不给力;可能是习惯了阿里云喂到嘴边的感觉,AWS很多方案需要自己折腾,蛋疼!比如这里要讲的mysql数据同步方案。阿里云产品DTS,点几下就OK了,AWS&…

06_01_Spark SQL

Spark SQL 课程目标 说出Spark Sql的相关概念说出DataFrame与RDD的联系独立实现Spark Sql对JSON数据的处理独立实现Spark Sql进行数据清洗 1、Spark SQL 概述 Spark SQL概念 Spark SQL is Apache Spark’s module for working with structured data. 它是spark中用于处理结…

百家号如何写文章赚钱,百家号写文章真的赚钱?

随着互联网的快速发展,越来越多的人开始关注到写文章赚钱这个领域。而在众多写作平台中,头条号无疑是最受欢迎的一个。那么,百家号写文章赚钱是真的吗?如何写文章赚钱呢?下面我们就来一一解答。 首先,百家号…

Javascript的ES6 class写法和ES5闭包写法性能对比

看到很多闭包写法的函数, 一直怀疑它对性能是否有影响. 还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数, 我很担心这样会影响性能. 于是, 做了一个实验来做对比. 这个实验很简单, 用md5计算一百万次. 计算过程将结果再放回参数, 这样避免结果没被引用被…

Git 学习(三)—— 本地仓库 — 远程仓库的操作命令

为了可以让其他用户看到自己的成果,我们可以将自己本地仓库的内容上传到远程仓库;如果我们希望借鉴其他用户的成果,我们可以将远程仓库里的一些内容拉取或者克隆到本地仓库。 这里先暂不考虑 本地到远程 或者 远程到本地 的一些相关操作&…

避坑指南—GPL开源协议

0x00 前言 本文主要目的是为了了解一些基础的GPL注意事项,以及防止被一些一知半解的人蒙骗。本文不做任何内容的依据,仅为个人见解,仅供参考。 一些常见的开源协议 GPLBSDMITMozillaApacheLGPL 0x01 GPL GPL许可协议(GNU General Public …

知识点——域适应、域泛化、在线测试适应区别 DA、DG、TTA区别

文章目录1.Domain Adaptation( DA:域适应 )源域和目标域:DA研究问题:DA目标:DA主要思想:DA三种方法:2.Domain generalization( DG:域泛化 )DG研究问题:DG目标:DA和DG优点…

css——图片缩放,拉伸,变形的解决办法

你的图片即将变得超级丝滑图片为什么会拉伸变形?怎么解决?css的object-fit属性object-fit属性有什么用介绍一下object-position举个小栗子图片为什么会拉伸变形? 前端布局时,图片会出现拉伸、缩放和变形的原因可能有多种: 1.例如图…

2.3操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

2.3操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则页式存储逻辑地址、物理地址如何判断物理地址和逻辑地址它们之间的地址关系?页面大小与页内地址长度的关系…

现货交易入门之垂死挣扎

本文讲解的也是挣扎形态,前面以已经讲过一个挣扎形态,但是本文这个形态的名字更让人能耳目一新,因为它叫“垂死挣扎线”,这并不是普通的挣扎线。是“垂死”的! “垂死挣扎线”与“顶部挣扎线”很相似,都是出…

JavaApi操作ElasticSearch(强烈推荐)

ElasticSearch 高级 1 javaApi操作es环境搭建 在elasticsearch官网中提供了各种语言的客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html 而Java的客户端就有两个: 不过Java API这个客户端(Transport Client&#…

element-ui日期选择器时间差

关于使用element-ui日期选择器时,发现时间差问题,特此记录下 #主要记录三个问题 日期选择器选择时获取到的格式相差八小时当日期格式为–拼接时,转成时间戳会相差八小时(2023-03-09)DatePicker设置区域范围和校验&…