MobileVIT原理详解篇

news/2024/5/13 23:24:57

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题

🍊专栏推荐:深度学习网络原理与实战

🍊近期目标:写好专栏的每一篇文章

🍊支持小苏:点赞👍🏼、收藏⭐、留言📩

MobileVIT原理详解篇

写在前面

Hello,大家好,我是小苏🧒🏽🧒🏽🧒🏽

​  在之前,我已经为大家介绍过各种基础的深度神经网络,像AlexNet、VGG、ResNet等等,也为大家介绍过一些轻量级的网络,如ShuffleNet系列、MobileNet系列等等,当然也做过一系列Transformer的教学,感兴趣的可以去我主页搜搜看喔。🍵🍵🍵

​  今天将为大家介绍一种新的网络结构——MobileVIT。🍄🍄🍄在具体介绍MobileVIT之前呢,我还是希望大家去阅读一些先验知识,链接如下:

  • CV攻城狮入门VIT(vision transformer)——近年超火的Transformer你再不了解就晚了! 🍁🍁🍁
  • CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇 🍁🍁🍁
  • CV攻城狮入门VIT(vision transformer)之旅——VIT代码实战篇🍁🍁🍁
  • 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】🍁🍁🍁

​  如果你理解了上面四篇文章的话,那么其实MobileVIT对你来说会是很好理解的。当然如果你对Transformer感兴趣的话,可以再看看下面的两篇博客:

  • Swin Transformer原理详解篇🍀🍀🍀
  • Swin Transformer代码实战篇🍀🍀🍀

MobileVIT的优势

在介绍MobileVIT的网络结构之前,我们先来聊聊为什么使用MobileVIT,即MobileVIT有什么优势?其实呢,在我看来,为什么使用MobileVIT,就是希望减少Transformer模型庞大的模型参数和较慢的推理速度,希望能将其部署在移动端。那么在论文中也有说到MobileVIT的优势,让我们一起来看看叭。

  • 更好的性能: 在给定的参数预算下,与现有的轻量化cnn相比,MobileViT模型在不同的移动视觉任务中获得了更好的性能。
  • 更好的泛化能力:泛化能力是指训练和评价指标之间的差距。对于两个具有类似训练指标的模型,具有更好的评估指标的模型更具有通用性,因为它可以更好地预测不可见的数据集。。之前的ViT变体(带卷积和不带卷积)与CNN相比,即使有广泛的数据增强,其泛化能力也很差,MobileViT显示出更好的泛化能力。如下图所示,MobileViT显示了与cnn类似的泛化能力。

image-20230521185508909

  • 更好的鲁棒性:一个好的模型应该对超参数具有鲁棒性,因为调优这些超参数会消耗时间和资源。与大多数基于ViT的模型不同,MobileViT模型使用基本增强训练,对L2正则化不太敏感。

MobileVIT网络结构

​ 论文中先是帮我们回顾了VIT的结构,如下图所示:

image-20230521190615575

​  你或与会发现这个图和我介绍VIT的原理时介绍的有些许差别,但是它们表达的含义都是一样的。首先会将图片划分成一个个patch,然后通过linear层将其转换成Token的形式,接着会加上位置编码并通过一系列Transformer结构,最后通过Linear层得到最终的输出。你对比一下上图和VIT中的结构,你会发现基本一致,主要是这里少加了Class token。


​  上文回顾了一下VIT,下面就让我们直接来看一看MobileVIT的整体结构叭~~~🌵🌵🌵如下图所示:

在这里插入图片描述

这个图画的非常简洁明了,我觉得大家可能存在疑惑的地方应该只有两个地方,第一个是这个MV2MV2 ↓2是什么结构?另一个就MobileViT block是什么结构?下面就让我们一个一个来看叭🌽🌽🌽

  • MV2MV2 ↓2结构

    这个结构其实就是MobileNetv2中的Inverted Residuals结构,不熟悉的点击☞☞☞了解详情。🌼🌼🌼这里我再简单帮大家回忆一下,Inverted Residuals的结构大致如下,即1x1卷积升维->3x3DW卷积->1x1卷积降维。🍚🍚🍚

    image-20230521212911167

    细心的朋友应该发现了MV2MV2 ↓2有两个结构,这个Inverted Residuals就一个结构呀,怎么对应的呀?其实呢,MV2 ↓2表示进行了2倍下采样,MV2MV2 ↓2的结构分别如下:

    image-20230521213228647

  • MobileViT block结构

MobileViT block结构如下图所示:

image-20230521192322162

​  我们先来一些看一下上图,首先对于一个 H × W × C H×W×C H×W×C的特征图X,首先经过一个Local representations层,其由一个 n × n n×n n×n的卷积和一个 1 × 1 1×1 1×1的卷积构成, 1 × 1 1×1 1×1的卷积用来调整通道数,经过Local representations层后得到特征图尺寸为 H × W × d H×W×d H×W×d。跟在Local representations层后面的是Transformers as Convolution层,这一层是一个Unfold->Transformer->Fold结构,也是MobileVIT的重中之重,我们后面再详细为大家介绍,现在你只要知道经过这个Transformers as Convolution层后特征图的尺寸没有发生变换,仍然是 H × W × d H×W×d H×W×d。之后会通过 1 × 1 1×1 1×1的卷积将特征图通道数调整为 C C C,即特征图尺寸变换成 H × W × C H×W×C H×W×C。最后会通过shortcut分支和原始特征图进行拼接,并通过一个 n × n n×n n×n的卷积得到最后的输出特征图。🍋🍋🍋

​  相信你已经知道了MobileViT block的大体结构,但是对于Transformers as Convolution层还是一头雾水,下面就让我带领大家一起来看看这一部分。🍗🍗🍗

​  这一部分分为三个结构,Unfold、Transformer以及Fold。先来说说Unfold和fold的操作叭。其实呀,这两个操作只是对数据的shape做了一些改变,让其符合Self-Attention结构的输入。那它们是怎么进行reshape的呢,如下图所示:

image-20230521214233919

图片来源于B站霹雳吧啦Wz

​  我想这里你应该会有疑问,这里为什么分patch操作,并弄不同的颜色表示呢?其实这就和后面的Transformer有关了。这里的Transformer结构相较与我之前介绍的有所改变,它会先对特征图进行patch划分,如下图划分patch大小为 2 × 2 2×2 2×2,即每个Patch由4个像素构成。在进行Transformer的时候,图中的相同颜色的小色块会进行Attention,而不同颜色的则不会进行Attention操作,这样会减少计算量。🍦🍦🍦

​  很多人可能都会问为什么要这么做,以及这么做的原因是什么。我给出霹雳吧啦Wz的看法,我认为是很有道理的:对于图像数据本身就存在大量的数据冗余,比如对于较浅层的特征图(H, W下采样倍率较低时),相邻像素间信息可能没有太大差异,如果每个Token做Attention的时候都要去看下相邻的这些像素,个人感觉有些浪费算力。这里并不是说看相邻的像素没有意义,只是说在分辨率较高的特征图上收益可能很低,增加的计算成本远大于Accuracy上的收益。而且前面已经通过nxn的卷积层进行局部建模了,进行全局建模时就没必要再看这么细了。🍍🍍🍍

image-20230521214657996

图片来源于B站霹雳吧啦Wz

MobileVIT实验效果

​  下图展示了MobileVIT在ImageNet上的效果,总的来说,MobileViTs易于优化和鲁棒性强。因此,MobileViT 可以很容易地应用于新的任务和数据集。

image-20230521215447682

小结

​  MobileVIT的原理部分就为大家介绍到这里啦,如果有不明白的地方欢迎评论区交流讨论。在下一节我将为大家介绍MobileVIT的代码实现,会进一步辅助大家理解MobileVIT的原理,一起加油叭~~~🥂🥂🥂

如若文章对你有所帮助,那就🛴🛴🛴

一键三连 (1).gif


http://www.mrgr.cn/p/01333102

相关文章

台灯护眼灯哪个牌子好?明基、书客、爱德华医生旗舰款护眼灯推荐

今日,我为大家深入评测了数款旗舰护眼台灯,目的在于帮助大家避开选购误区,为我们的双眼营造一个既健康又安全的照明环境。每一款台灯都经过严格的实测数据对比,从而揭示出它们各自的优劣。无论是从照明效果、舒适性还是使用寿命等…

记一次 .NET某防伪验证系统 崩溃分析

一:背景 1. 讲故事 昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障,因为看小伙子昨天在群里问了一天也没搞定,干脆自己亲自上阵吧,抓取的dump也是我极力推荐的用 procdump 注册 AEDebug 的方式,省去了很多沟通成本。 二:WinDbg分析 1. 为什么会崩溃 windbg有一个非…

MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

本文基于 Linux 内核 5.4 版本进行讨论自上篇文章《从 Linux 内核角度探秘 JDK MappedByteBuffer》 发布之后,很多读者朋友私信我说,文章的信息量太大了,其中很多章节介绍的内容都是大家非常想要了解,并且是频繁被搜索的内容,所以根据读者朋友的建议,笔者决定将一些重要的…

SpringCloud(三)统一网关 -- GateWay

gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/网关的作用: 1、对用户请求做身份认证、权限校验 2、将用户请求路由到微服务,并实现负载均衡 3、对用户请求做限流搭建网关服务 基本使用只配置 1、2 步就可以 …

【机器学习】包裹式特征选择之序列前向选择法

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果: 这里,cat的第一个输入变量用()包绕&#xf…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析),一开始看这块其实挺懵的,不会就去问百度或其他人,当时遇见困难挺害怕的…

【Linux】从零开始认识进程 — 中下篇

送给大家一句话: 人一切的痛苦,本质上都是对自己无能的愤怒。而自律,恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

【运维】在阿里云上搭建自己的图床,配合PicGo和Typora使用

本文将详细介绍如何在阿里云上搭建自己的图床,包括购买OSS服务、配置域名解析、创建OSS存储桶和设置图片上传规则等步骤。希望对您有所帮助! 一、购买OSS服务 首先,我们需要在阿里云官网购买OSS(Object Storage Service)服务。OSS是阿里云提供的一种海量、安全、低成本、高可…

ffmpeg学习window下使用Visual Studio创建cpp项目添加ffmpeg源代码编译好的依赖库

ffmpeg学习window下使用Visual Studio创建cpp项目添加ffmpeg源代码编译好的依赖库 1. 创建cpp项目启动Visual Studio,创建新项目选择控制台运用程序随便输入一个项目名称,点击创建,完成hello world项目的创建编译和运行项目,按f7编译项目,按f5运行项目下次重新打开项目怎么…

IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)

系列文章 IntelliJ IDE 插件开发 |(一)快速入门IntelliJ IDE 插件开发 |(二)UI 界面与数据持久化IntelliJ IDE 插件开发 |(三)消息通知与事件监听IntelliJ IDE 插件开发 |(四)来查收…

Django之图形验证码

【1】生成图片验证码依赖于pillow模块 pip install pillow 使用pillow模块在导入时使用import PIL,而不是pillow【1.1】Pillow图像生成模块 from PIL import Image, ImageDraw, ImageFont # Image : 生成图片对象 # ImageDraw : 生成画笔对象 # ImageFont : 控制字体样式# 图片…

BBS项目创作流程

BBS项目创作流程 【零】完整文件gitee仓库BBS/BBS1.0/BlogBasedSystem Lea4ning/DjangoObject - 码云 - 开源中国 (gitee.com)【一】项目基本配置 【1】所需模块 asgiref==3.7.2 beautifulsoup4==4.12.3 certifi==2024.2.2 charset-normalizer==3.3.2 Django==3.2.12 fake-use…

Python shp矢量提取多波段栅格图像的均值、提取采样点数值

目录 一、背景介绍 二、实现 1、取样本点数值 2、取区域均值 一、背景介绍 一般我们在利用Arcgis进行按shp提取多波段的均值或者采样点的数值,这是非常麻烦的。如果图像非常大,当shp的采样点非常多的时候,根本出不了结果。因此&#xff…

BLE --- GAT/GATT

GAT GAT 定义了数据交互的协议(PDU、各种命令),和存储在 server 的各种 attribute。 PDU 格式 命令类型具体命令 具体的命令由 Attribute Opcode 指定atttributeGATTGATT 使用 GAT 进行数据交互,对存储在 server 设备的 attribute 操作

网络安全:Kali Linux 进行SQL注入与XSS漏洞利用

目录 一、实验 1.环境 2.Kali Linux 进行SQL注入 3.Kali Linux 进行XSS漏洞利用 二、问题 1.XSS分类 2.如何修改beef-xss的密码 3.beef-xss 服务如何管理 4.运行beef报错 5.beef 命令的颜色有哪些区别 6.owasp-top-10 有哪些变化 一、实验 1.环境 (1&a…

Python 全栈系列236 rabbit_agent搭建

说明 通过rabbit_agent, 以接口方式实现对队列的标准操作,将pika包在微服务内,而不必在太多地方重复的去写。至少在服务端发布消息时,不必再去考虑这些问题。 在分布式任务的情况下,客户端本身会启动一个持续监听队列的客户端服…

Oracle重做日志文件clear logfile与clear unarchived logfile浅析

首先,从v$log动态视图中观察到ARC和STATUS两个字段STATUS:分为CURRENT、ACTIVE和INACTIVE三种,当数据库进程DBWn进行一次写入,脏数据从内存刷写到redo logfile中,这时承载数据写入的redo logfile状态即为CURRENT;而数据从redo logfile拷贝到归档目录下时处于ACTIVE状态,…

第十篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作Excel

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列博文目录 前言一、重要作用解说二、Python操作Excel的常用库介绍三、数据处理和分析示例代码四、自动化报表生成示例代码五、数据导入和导出示例代码六、数据可视化示例代码八、数据校验和清洗示例代码九、…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …