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

news2024/9/20 20:36:50

补充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 = dim
        self.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.shape
        assert L == H * W, "input feature has wrong size"
 
        x = x.view(B, H, W, C)
 
        # padding
        # 如果输入feature map的H,W不是2的整数倍,需要进行padding
        pad_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.coloradmin.cn/o/2037639.html

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

相关文章

【新手入门必看】字符串

一、初识字符串 1、定义的几种格式 和整型数组一样&#xff1a;int data[]{1,2,3,4,5}; char str[]{h,e,l,l,o}; 之前我们学过数组名就等于地址&#xff0c;那么也可以通过指针的方式来定义char *pchar"hello"; #include <stdio.h>int main(int arg…

C++-类与对象(中上篇)

一、目标 1. 类的 6 个默认成员函数 2. 构造函数 3. 析构函数 二、对目标的介绍 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生…

Spring源码-源码层面讲解bean标签添加了lookup-method和replaced-method标签之后源码执行流程,以及对象实例化的流程

bean.xml文件添加lookup-method和replaced-method标签 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

怎么转换视频格式?常见的3种格式转换方法

随着手机等工具的普及&#xff0c;拍视频已经变成我们日常生活娱乐的方式。在享受拍视频带来的快乐同时&#xff0c;我们需要灵活运用格式转换来满足不同的播放设备和使用场景的需求。怎么转换视频格式&#xff1f;很多人为了视频格式转换这个问题烦恼。 视频格式转换&#xf…

ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141140498 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 ComfyU…

PhpStorm完全配置指南:打造高效PHP开发环境!

Phpstorm环境配置与应用&#xff0c;具体包括安装PhpStorm、配置PHP运行环境、Apache集成、调试和部署等步骤。下面将详细展开每个步骤的具体操作和注意事项。 PhpStorm的下载与安装 下载地址&#xff1a;访问PhpStorm的官网下载地址&#xff0c;选择合适的版本进行下载。建议选…

【零基础学习CAPL语法】——TestWaitForMessage:等待指定报文

文章目录 1.函数介绍2.实例1.函数介绍 TestWaitForMessage——等待指定报文 long TestWaitForMessage(dbMessage aMessage, dword aTimeout); long TestWaitForMessage(dword aMessageId, dword aTimeout); long TestWaitForMessage(dword aTimeout); 若在aTimeout时间内等到了…

练习题PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

突破长度限制 使用usort上传后门 usort — 使用用户自定义的比较函数对数组中的值进行排序 paramusort(...$GET); ...为php设置可变长参数 在url地址栏中输入[]test&1[]phpinfo();&2assert 包含了phpiinfo&#xff08;&#xff09;命令执行 结合usort使用 assert…

leetcode695.岛屿的最大面积

题目描述 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 岛屿的面积是岛上值为 1 的单元格的数目。 计算并…

小阿轩yx-Docker 基本管理

小阿轩yx-Docker 基本管理 &#xff08;镜像制作与管理&#xff09; Docker 镜像管理 Docker 镜像除了是 Docker 的核心技术&#xff0c;也是应用发布的标准格式一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行进入容器之后最常见的操作就是在容器中安装应用服务 Do…

Python绘图入门:使用Matplotlib绘制柱状图

Python绘图入门&#xff1a;使用Matplotlib绘制柱状图 柱状图是一种常见的数据可视化方式&#xff0c;能够直观地展示不同类别之间的数据差异。在Python中&#xff0c;Matplotlib是一个非常强大且灵活的绘图库&#xff0c;它不仅能绘制简单的图表&#xff0c;还能创建复杂的多…

importlib库介绍

importlib importlib 包的目的有两个。 一种是在 Python 源代码中提供 import 语句&#xff08;因此&#xff0c;通过扩展&#xff0c;import() 函数&#xff09;的实现。 这提供了 import 的实现&#xff0c;它可以移植到任何 Python 解释器。 这也提供了一种比 Python 以外…

【鸿蒙学习】使用HarmonyOS NEXT与Uniapp开发同一鸿蒙应用的区别及分析

随着鸿蒙操作系统的普及&#xff0c;开发者面临着多种开发工具的选择。本文将通过开发、部署、运行、使用四个方面&#xff0c;详细分析使用HarmonyOS NEXT与Uniapp开发同一鸿蒙应用的区别&#xff0c;为开发者提供参考。 一、引言 鸿蒙操作系统&#xff08;HarmonyOS&#xf…

拿到服务器做的事:自己写的最全的一个,方便后续使用

1、ssh密钥登录 1.1本机生成密钥 这里是windows的命令 1.2上传.pub文件到服务器端 服务器端的操作&#xff1a; 本机用记事本打开.pub文件&#xff0c;复制到服务器端 我这里是新建了一个hh文件&#xff0c;粘贴过去了 vim hh1.3密钥写入到密钥key文件中 cat hh >>…

【C语言初阶】C语言指针全攻略:解锁C语言深层奥秘的钥匙

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言操作符 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀指针 &#x1f4d2;1. 指针和指…

于博士Cadence视频教程学习笔记备忘

标签&#xff1a;PCB教程 PCB设计步骤 cadence教程 Allegro教程 以下是我学习该视频教程的笔记&#xff0c;记录下备忘&#xff0c;欢迎大家在此基础上完善&#xff0c;能回传我一份是最好了&#xff0c;先谢过。 备注&#xff1a; 1、未掌握即未进行操作 2、操作软件是15.…

【问题记录+总结】VS Code Tex Live 2024 Latex Workshop Springer模板----更新ing

目录 Summary 道阻且长 少即是多 兵马未动粮草先行 没有万能 和一劳永逸 具体问题具体分析 心态 Detail 1、关于模板[官网] 2、settings.json 3、虫和杀虫剂 4、擦 换成Tex Studio都好了。。。 Summary 道阻且长 某中意期刊&#xff0c;只有Latex。之前只简单用过…

VSCODE platformio ESP32-S3 内置 JTAG 接口断点单步调试笔记

ESP32 S3的两种JTAG调试方法 ESP32 S3的有两种JTAG调试方法&#xff0c;直接连接板子上的JTAG引脚进行调试&#xff0c;或者用ESP32-S3 内置 JTAG 接口进行调试&#xff0c;这些方法有助于开发者在开发过程中进行更深入的调试。 1、ESP32-S3 内置 JTAG 接口 使用 ESP32-S3 内…

第63期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

如何使用unittest和pytest进行python脚本的单元测试

1. 关于unittest和pytest unittest是python内置的支持单元测试的模块&#xff0c;他提供了核心类&#xff0c;TestCase&#xff0c;让单元测试 代码的编写不再是从0开始&#xff0c;不再是作坊式&#xff0c;而是标准化&#xff0c;模板化&#xff0c;工厂化。 pytest是第三方…