【笔记】Swin-Transformer 的计算量与Transformer的计算量的对比:前者通过使用新颖的窗口技巧,将后者的高阶项变为低阶,大大降低了计算量

补充1:

  • 局部窗口内的自注意力(W-MSA):

    • 在 Swin Transformer 中,输入特征图被划分为多个小的窗口(例如 7x7 的窗口)。在每个窗口内,计算自注意力机制(W-MSA, Window-based Multi-Head Self-Attention),这意味着每个 token 只和同一窗口内的其他 token 进行交互。
    • 由于计算只发生在局部窗口内,所以计算复杂度大大降低,特别是对于高分辨率的输入图像来说,这种方式更加高效。
  • 滑动窗口机制(Shifted Window Attention):

    • 为了在局部窗口之间传递信息,Swin Transformer 引入了滑动窗口机制。通过在不同的层中移动窗口的位置,使得相邻窗口之间的特征可以进行交流,从而保证全局上下文的信息逐步整合到特征中。
  • 计算量的比较:

    • 全局自注意力(MSA):像 Vision Transformer (ViT) 这样的方法在整个特征图上计算自注意力,计算复杂度是 O((hw)²)。
    • 窗口内自注意力(W-MSA):Swin Transformer 仅在每个窗口内计算,计算复杂度降低为 O(W * M²),其中 W 是窗口的数量,M 是窗口内的 token 数量(例如 7x7 = 49 个 token)。
  • 滑动窗口的好处:

    • 滑动窗口机制允许信息在不同窗口之间传递,而不仅仅局限在窗口内部。这种设计平衡了计算效率和特征提取的全局性,确保 Swin Transformer 可以在较低的计算复杂度下仍然获得良好的表现。

补充2:

关于特征图大小的解释:

  • 输入图像大小(224x224):

    • 在大多数计算机视觉任务中,输入图像通常会被调整为 224x224 像素。
  • Patch Embedding 和 Stride=16:

    • Vision Transformer (ViT) 通常会将输入图像划分为 16x16 的 non-overlapping patches,然后将每个 patch 展平并映射到一个高维的特征空间。
    • 因为每个 patch 的大小是 16x16,且是 non-overlapping 的,这相当于对输入图像应用了一个 Stride=16 的卷积操作,将图像的空间分辨率从 224x224 减少到 14x14。
  • 特征图大小(14x14):

    • 因此,经过 Stride=16 的操作后,原始图像被划分为 14x14 个 patch,每个 patch 被视为一个 token。在 Vision Transformer 中,这 14x14 个 token 会形成一个 196 维的 token 序列。

Swin Transformer 的不同点:

Swin Transformer 在一些细节上和 ViT 有所不同:

  • 多级特征图:
    • Swin Transformer 处理的是逐级降低空间分辨率的特征图(类似于卷积神经网络中的多尺度特征),比如从最开始的较大特征图(例如 h=w=56)到最后的较小特征图。
  • 滑动窗口与局部自注意力:
    • 在 Swin Transformer 中,通过窗口内自注意力(W-MSA)和滑动窗口(Shifted Window)机制来逐步处理这些特征图,计算局部区域内的自注意力。

图中的特征图大小与实际应用:

在你提供的图片中,h=w=56 可能指的是在 Swin Transformer 的某个阶段,特征图被处理时的空间分辨率。例如,在较早的阶段,特征图的空间分辨率较高,经过几次降采样后,可能从 224x224 降到 56x56 甚至更低。

因此,特征图的大小 (14x14 或 56x56) 取决于模型的阶段以及具体的网络结构。在 Swin Transformer 中,早期层的特征图可能较大,而后期层的特征图可能较小,这与 Vision Transformer 中固定的 14x14 特征图有所不同。

补充3:

关于正文中h=w=56, m=7 的补充:

在 Swin Transformer 中,h=w=56m=7 是针对特定阶段的特征图大小和窗口大小。这些参数在 Swin Transformer 中是有具体含义的:

1. h=w=56 的解释

  • 初始阶段的特征图大小:
    • Swin Transformer 通常会通过多级特征提取器(类似卷积神经网络中的多尺度特征提取),逐步缩小特征图的空间分辨率。
    • 例如,在初始阶段,输入图像可能会被划分成大小为 4x4 的 patch(相当于 Stride=4),并将输入图像从原始的 224x224 分辨率降采样到 56x56 的特征图。
    • 具体来说,224x224 的输入图像通过 Stride=4 的操作后,特征图的大小变成 224/4 = 56,既 h=w=56

2. m=7 的解释

  • 窗口大小(Window Size):
    • Swin Transformer 的一个关键特点是,它引入了基于窗口的多头自注意力(W-MSA),这个窗口是在特定大小的局部区域内进行自注意力计算的。
    • m=7 表示窗口的大小为 7x7,也就是说,在每一个 7x7 的局部区域内计算自注意力,而不是在整个 56x56 的全局上计算。
    • 通过将大的特征图(例如 56x56)划分为多个 7x7 的窗口,Swin Transformer 可以在保持计算量可控的前提下,捕捉局部的相关性。

Swin Transformer 的多级结构

Swin Transformer 的网络结构通常分为多个阶段,每个阶段的特征图大小和窗口大小可能有所不同:

  • Stage 1: 假设输入图像为 224x224,通过 Stride=4 的 patch embedding 操作,特征图的大小变为 56x56。
  • Stage 2: 在 Stage 1 处理后的 56x56 特征图基础上,应用 7x7 的窗口来进行局部自注意力计算。
  • Stage 3: 特征图继续下采样到更小的分辨率(例如 28x28 或 14x14),然后继续应用更小的窗口进行计算。

注1:

注2:


class PatchMerging(nn.Module):r""" Patch Merging Layer.Args:dim (int): Number of input channels.norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm"""def __init__(self, dim, norm_layer=nn.LayerNorm):super().__init__()self.dim = dimself.reduction = nn.Linear(4 * dim, 2 * dim, bias=False)self.norm = norm_layer(4 * dim)def forward(self, x, H, W):"""x: B, H*W, C"""B, L, C = x.shapeassert L == H * W, "input feature has wrong size"x = x.view(B, H, W, C)# padding# 如果输入feature map的H,W不是2的整数倍,需要进行paddingpad_input = (H % 2 == 1) or (W % 2 == 1)if pad_input:# to pad the last 3 dimensions, starting from the last dimension and moving forward.# (C_front, C_back, W_left, W_right, H_top, H_bottom)# 注意这里的Tensor通道是[B, H, W, C],所以会和官方文档有些不同x = F.pad(x, (0, 0, 0, W % 2, 0, H % 2))x0 = x[:, 0::2, 0::2, :]  # [B, H/2, W/2, C]x1 = x[:, 1::2, 0::2, :]  # [B, H/2, W/2, C]x2 = x[:, 0::2, 1::2, :]  # [B, H/2, W/2, C]x3 = x[:, 1::2, 1::2, :]  # [B, H/2, W/2, C]x = torch.cat([x0, x1, x2, x3], -1)  # [B, H/2, W/2, 4*C]x = x.view(B, -1, 4 * C)  # [B, H/2*W/2, 4*C]x = self.norm(x)x = self.reduction(x)  # [B, H/2*W/2, 2*C]return x

正文:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于LQR算法的机器人轨迹跟踪控制详解

本文摘要 本文详细介绍了基于线性二次型调节器(LQR)算法的机器人轨迹跟踪控制方法。首先,文章通过建立基于运动学模型的离散状态方程,来描述机器人的当前状态与目标状态之间的关系,并利用此模型进行状态误差的计算。接…

「Unity3D」TextMeshPro-Text(UI)无法拖放到TextMeshPro的属性面板上

继承MonoBehaviour,然后定义public TextMeshPro textPro,属性面板上就会有TextMeshPro的拖放槽(slot),以配置含有TextMeshPro的组件对象(GameObject)。 但此时会发现,含有TextMeshPr…

Linux10 三剑客 正则表达式

三剑客 grep 擅长过滤,按行过滤 首先要把多个虚拟机的网络改成一种形式 爆破攻击:‌爆破攻击是一种尝试通过穷举法(即尝试所有可能的组合)来破解密码或身份验证的方法。这种攻击通常用于尝试登录到系统、网络或应用程序&#…

C#方法

在 C#中,方法的定义包括任意方法修饰符(如方法的可访问性)、返回值的类型, 然后依次是方法名、输入参数的列表(用圆括号括起来)和方法体(用花括号括起来)。 [修饰符] 返…

【昂贵的婚礼】

题目 代码 #include<bits/stdc.h> using namespace std; typedef pair<int, int> PII; #define x first #define y second const int N 110, M 10110; int h[N], e[M], ne[M], w[M], idx; bool st[N]; int n, m; int dist[N]; int tier[N]; void add(int a, int…

爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍

RPC (Remote Procedure Call) 是远程调用的意思。 在 Js 逆向时&#xff0c;本地可以和浏览器以服务端和客户端的形式通过 WebSocket 协议进行 RPC 通信&#xff0c;这样可以直接调用浏览器中的一些函数方法&#xff0c;不必去在意函数具体的执行逻辑&#xff0c;可以省去大量…

超详细!!!electron-vite-vue开发桌面应用之Electron Forge打包项目(三)

云风网 云风笔记 云风知识库 electronforge可将前端静态页面打包成.exe、.deb和.rpm等&#xff0c;能适配各种平台 一、安装依赖 cd my-app npm install --save-dev electron-forge/cli npm exec --packageelectron-forge/cli -c "electron-forge import"安装后pack…

简化工作流连线以及让工作流易于操作的插件:rgthree-comfy与cg-use-everywhere

当我们想要在工作流中进行多种不同配置、功能模块&#xff0c;并在多种不同配置、功能模块间进行切换&#xff0c;每次可以执行不同配置、功能模块&#xff0c;用原来简单的连线方式连接各个节点时&#xff0c;除了连线会十分复杂外&#xff0c;要切换不同配置、功能模块&#…

直接插入排序(C语言)

一、图解 思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 。 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时…

【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会

JDBC的原理 JDBC&#xff08;Java Database Connectivity&#xff09;是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互&#xff0c;以下是JDBC的基本原理&#xff1a; 驱动程序管理&#xff1a;JDBC使用不同的数据库驱动程序来连接不同类型的…

兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求

随着视频技术的不断进步&#xff0c;视频监控、视频直播、执法记录仪、语音可视对讲、无人机等视频资源的应用场景日益丰富。这些视频资源不仅在数量上快速增长&#xff0c;而且在质量、格式、编码标准等方面也呈现出多样化的特点。因此&#xff0c;为了有效整合这些资源&#…

2024年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 列表 fruit = [‘西瓜’, ‘菠萝’, ‘哈密瓜’, ‘葡萄’],以下哪个选项,可以获取列表最后一个元素?( ) A:fruit[len(fruit)] B:fruit[len(fruit) - 1] C:fruit[len(fruit) + 1] D:fr…

echarts学习:绘制地图

前言 经过之前一段时间的磨砺&#xff0c;我具备了基本的使用echarts绘制图表的能力。但是在最近这几个月里我接连遇到了几个棘手的任务&#xff0c;这大大的提升了我的echarts水平。其中我遇到的第一个高难度任务就是使用echarts绘制如下的地图&#xff1a; 简单的分析一下&a…

Android studio 引入Json文件

Xcode引入json文件非常简单&#xff0c;没想到Android Studio是有讲究的&#xff0c;必须指定位置。 跟 lib 同一级目录下 创建一个assets&#xff08;如果不存在就创建&#xff09; future: DefaultAssetBundle.of(context).loadString(assets/appcenter.json),针对我这个路…

使用Leaks定位iOS内存泄漏问题并解决

使用Leaks定位iOS内存泄漏问题并解决 前言 内存泄漏问题一直是程序开发中最令人头疼的问题&#xff0c;特别是C/C。虽然C/C在C11之后引入了许多新特性&#xff0c;包括智能指针&#xff0c;自动类型推导等&#xff0c;但C中动态内存的分配和释放仍然需要程序员来显式地进行。…

【网络协议】精讲TCP通信原理!

前言 TCP 把连接作为最基本的对象&#xff0c;每一条 TCP 连接都有两个端点&#xff0c;这种端点我们叫作套接字&#xff08;socket&#xff09;&#xff0c;它的定义为端口号拼接到 IP 地址即构成了套接字&#xff0c;例如&#xff0c;若 IP 地址为 192.3.4.16 而端口号为 80&…

CSS设置文本超出显示省略号

一、单行文本显示省略号 <div class"box"><p>测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本…

C# 静态方法和实例方法

一、静态成员&#xff0c;实例成员&#xff0c;静态方法&#xff0c;实例方法 静态成员就是用static修饰的字段&#xff1b; 实例成员就是没有被static修饰的字段&#xff1b; 静态方法就是用static修饰的方法&#xff1b; 实例方法就是没有被static修饰的方法&#xff1b;…

无人机之如何避免飞行错误篇

在无人机飞行中&#xff0c;飞手可能会遇到各种问题&#xff0c;这些问题不仅会影响飞行效果&#xff0c;还可以带来安全隐患。以下是一些常见的错误及避免方法&#xff0c;帮助飞手提高飞行稳定性和安全性&#xff1a; 一、校准传感器 IMU&#xff08;惯性测量单位&#xff0…

HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求

引言 在现代Web开发中&#xff0c;HTTP请求的高效性和可靠性对于应用的整体性能至关重要。ASP.NET Core提供了HttpClient类&#xff0c;它是一个强大且灵活的工具&#xff0c;可以用来发送HTTP请求并处理响应。然而&#xff0c;如何在ASP.NET Core中实现高效的HTTP请求&#x…