MobileVIT原理详解篇

2024-03-28 11:52
文章标签 详解 原理 mobilevit

本文主要是介绍MobileVIT原理详解篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

这篇关于MobileVIT原理详解篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)