第十三章 原理篇:SWIN-transformer

news2024/9/21 8:03:07

累了,没写完
面试完了再来写

参考教程:
swin-transformer/model.py

文章目录

  • 概述
  • transformer blocks
    • window_partion
    • W-MSA
    • window-reverse
    • Patch Merging

概述

在前面介绍了vision transformer的原理,加入transformer的结构后,这种网络在多种图像任务中都取得了不错的结果。但是它也存在一些问题。

第一个问题就是上一章提过的粗粒度问题,patch的大小比较大时,一个patch内可能有多个相似特征。

第二个问题就是当你想获得更多的特征时,就必须使用很长的序列。这里的序列长度指的是N*D中的N。想要获得更多的N,patch的大小就需要变小,也就是更加细粒度。但是这种情况下,在计算内积的时候就效率很低,尤其考虑到encoder的block要反复做很多次,速度就更慢了。

swin-transformer使用窗口和分层的方式。为了把结果做的比较好,第一层用很细的token,在后面的层里为了提高效率,开始进行token的合并。经过每一层合并,token会越来越小。

token数量逐渐降低,就像卷积网络中feature map逐渐减小的过程。swin-transformer其实就是模拟了CNN的过程,随着层次的加深,token的数量降低,但是embedding_dim按层翻倍。

看整个流程,本质上还是一样的。首先对输入的图像进行编码。这里使用的是patch partition, 获得H/4*W/4个embedding,embedding_dim = 4*4*3 = 48。
在这里插入图片描述
之后开始在网络中进行一层一层的forward。并且隔几个block进行一次patch merging。patch merging的作用就是将patch合并在一起,减少patch的数量。

综合来说,它的整体架构还是可以分成两部分:

  1. 得到pacth。
  2. 分层计算attention

transformer blocks

在这里插入图片描述
在swin-transformer中,一个block里面包括了两个sub-block。
第一个sub-block是W-MSA + MLP。
第二个sub-block是SW-MSA + MLP。

两个subblock连在一起才是完整的结构。
从源码上看在进入和离开窗口时,embedding都会有形状的改变,分别为window_partition,作用是把大小为B*N*D的输入转成窗口的格式。在经过attention计算后,再使用window_reverse转回去。

整个block的计算公式可以写为:
在这里插入图片描述

window_partion

window-MSA:基于窗口的注意力计算。
比如说我们的输入是一个224*224*3的图像,在经过patch embedding后得到56*56*96的结果。也就是说我们的图像被分成了56*56个4x4的小patch,每个4*4的小patch在处理后得到长度为96的embedding。

那么为了使用window-MSA,我们需要将这个patch_embedding再次变成一个窗口一个窗口的形状。假设我们的窗口大小为7。那么我们就可以得到8*8*7*7*96大小的embedding。前面的8*8代表你的window的个数,7*7是你的window的大小,96是每个位置的embedding的长度。

W-MSA

window-MAS就是在window范围内进行的自注意力计算。一个窗口的大小是7*7,也就是说每个窗口内有49个元素,我们要求这49个元素互相的关注度。

因为只在窗口内进行计算,所以可以理解成 8*8 = 64是你的batch_size, batch中的每个特征是不会互相影响的。7*7 = 64是你的word_number,96是你的word的embedding。这其实是和普通的MSA计算过程是一样的。

现在我们使用多头MSA对我们的64*49*96的输入进行计算。我们可以得到:
S i z e O f ( Q / K / V ) = 64 × 3 × 49 × ( 96 / 3 ) SizeOf(Q/K/V) = 64 \times 3\times 49\times (96/3) SizeOf(Q/K/V)=64×3×49×(96/3)
Q和K进行内积,得到的关注度大小为64*3*49*49。
然后再和V加权求和,得到最终输出的token大小为64*3*49*(96/3)。

window-reverse

我们的token在进入block时进行了partion,再出去时我们希望得到的结果能保持和输入的token一样的大小。
对上面的结果直接进行reshape,就可以从64*49*96变回56*56*96。

Patch Merging

patch merging在这里就相当于一个下采样操作。
并且它采用的方法在之前也很常见,具体可以参考yolov2的passthrough,yolov5的FOCUS模块。本质上就是从一个feature map上间隔挑选,挑出4个大小为 h/2, w/2的新feature,并concat到一起,那么它的通道数其实是变成了4倍。

所以在后面又添加一个卷积层,进行降维操作。从而达成一次下采样,维度翻一倍的经典类卷积网络结构。

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

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

相关文章

HCIP(HCIA回顾)

OSI/RM 七层 应用层 表示层 会话层 传输层 区分不同的流量,定义传输方式。 端口号由16位二进制构成,范围为0~65535(其中0不作为传输层的端口使用),所以真实取值范围为1~65535;其中,1~1023称为知名端口号。 1、可靠…

React Native 集成到iOS原有的项目上

1.官方说明地址: 集成到现有原生应用 2. 主要步骤说明 把 React Native 组件集成到 iOS 应用中有如下几个主要步骤: 配置好 React Native 依赖和项目结构。了解你要集成的 React Native 组件。使用 CocoaPods,把这些组件以依赖的形式加入到项…

【推式子 二项式定理】Wannafly挑战赛 B

B-求值2_Wannafly挑战赛17 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e610; const int mxe2e510; const int Inf0x3f3f3f3f; const int mod998244353;int N;…

碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

sql统计某一字段不同状态的数量,时间戳转日期格式、按月统计使用

背景 1、在sql语句中统计一个字段的不同状态时&#xff0c;需要将每个状态的数量查出来&#xff0c;在进行统一输出&#xff0c;涉及表多次查询&#xff0c;下面用一个聚合函数的方式进行查询&#xff0c;比较方便&#xff0c;容易理解。 2、有时候数据表中的时间字段存储的是…

谈高考志愿填报

目录 不如先说说我自己。 一、选专业还是选学校&#xff1a; 二、你想推荐/避雷的专业&#xff1a; 三、填报志愿的策略&#xff1a; 四、影响专业选择的因素&#xff1a; 各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&…

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战&#xff08;27&#xff09;——追踪视频中的特征点 0. 前言1. 追踪视频中的特征点2. 特征点追踪原理3. 完整代码小结系列链接 0. 前言 我们已经知道可以通过一些最独特的点来分析图像&#xff0c;对于图像序列同样如此&#xff0c;其中一些特征点的运动可用于了解捕…

机器视觉之表面缺陷检测

曾有一个科研项目&#xff0c;青岛啤酒厂委托&#xff0c;研究啤酒瓶的质量检测。 一般这种玻璃瓶会有一定次品、不良品&#xff0c;特征是&#xff0c;内部细细的裂缝纹路长度长于一定限制&#xff0c;那么这种啤酒瓶在运输或者开瓶盖的过程中就有炸裂的风险。 所以&#xf…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

mysql数据(添加,修改,删除,单表查询)操作

插入&#xff1a; 主键自增&#xff08;第一列&#xff09;&#xff0c;可以写null&#xff0c;自动生成 最后一列是空值null&#xff0c;即不给分配 如果设置了默认值&#xff0c;如性别设置了默认值男&#xff0c;就可以写default 1、 查询起别名&#xff0c;如果别名有特…

操作数据库DDL、DML

DDL 1、创建表 create table tb_user(id int,username varchar(20),password varchar(10) ) 2、数据类型 3、删除表 drop table 表名 4、修改表 修改表名 alter table 表名 rename to 新表名 添加一列 alter table 表名 add 列名 数据类型修改数据类型 …

Vue中watch与computed区别

<body><div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/><br/>全名&#xff1a;&…

virtio-net前端-virtqueue

文章目录 1.概述2.数据结构3. 流程分析3.1 virtio总线创建3.3virtio-net3.3.1virtio-net初始化![在这里插入图片描述](https://img-blog.csdnimg.cn/7246c1705ac24f88b75fad63f8941ca5.png)3.3.2 virtio-net驱动发送3.3.3 Qemu virtio-net设备接收 4.virtqueue4.1数据结构4.2发…

模糊测试Fuzzing基础知识学习笔记

概念 模糊测试&#xff08;Fuzzing&#xff09;&#xff0c;是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。在模糊测试中&#xff0c;用随机坏数据&#xff08;也称做 fuzz&#xff09;攻击一个程序&#xff0c;然后观察哪里遭到了破坏。 模糊测试…

6.Mysql自连接

针对相同的表进行的连接被称为“自连接”&#xff08;self join&#xff09; 那么为什么要把相同的一张表连接起来呢&#xff1f;一开始还是挺难理解的。把它想象成连接两张不同的表&#xff0c;这样容易理解一些。事实上&#xff0c;自连接还是有很多用处的 1. 在同一张表内进…

模板初识与STL简介

初识模板 引言函数模板定义实例化隐式实例化显式实例化 类模板定义实例化 STL简介STL六大组件 总结 引言 模板是泛型编程的基础 在之前我们介绍过函数重载&#xff0c;可以定义许多函数名相同参数列表不同的重载函数&#xff0c;来实现不同类型的相似操作。调用重载函数时会根…

chatgpt赋能python:归一化在PyTorch中的运用

归一化在PyTorch中的运用 PyTorch是一种广泛使用的深度学习框架&#xff0c;它可以用于训练和预测各种类型的神经网络。在深度学习中&#xff0c;归一化是提高模型性能的一种常用技术。归一化是指将输入数据进行标准化或规范化处理&#xff0c;以确保数据的统一性和一致性。在…

golang硬核技术(二)go程序从启动到运行到底经历了啥

前言 go相对其他语言&#xff0c;对并发的支持更友好。这使得他的设计和其他程序迥然不同。让我们来看看它都是如何初始化程序的&#xff0c;从程序加载到运行到底经历的什么。 我们继续之前的版本1.18.4 汇编入口 首先我们编译一个hello world 程序。 package main impor…

python--连接oracle数据库

python--连接oracle数据库 前言一、安装cx_Oracle二、导入库三、数据库操作实例3.1 连接3.2数据库查询3.3数据库插入3.4 实例从某网站上面爬取彩票号码 四、异常4.1、运行时&#xff0c;出现连接数据库失败:DatabaseError:DPI-1047解决连接失败问题1、查看Oracle的版本号2、进入…

辅助驾驶功能开发-功能规范篇(21)-1-XP行泊一体方案功能规范

XPilot Safety 主动安全系统 一、前向碰撞预防(Forward Collision Prevention) - 产品定义 基于车辆前向视觉模块和前毫米波雷达的感知能力,对车辆前方扇形区域内的车辆和VRU(弱势道路使用者) 有可能与本车的运行路线发生碰撞,进行预警、碰撞伤害降低或碰撞避免的一系列…