Swin Transformer代码实现部分细节重点

news2025/7/18 5:40:38

swin transformer

1.patch-merging部分
在这里插入图片描述
代码:【amazing】

		x0 = x[:, 0::2, 0::2, :]  # [B, H/2, W/2, C]  对应图片所有 1 的位置
        x1 = x[:, 1::2, 0::2, :]  # [B, H/2, W/2, C]  对应图片所有 3 的位置
        x2 = x[:, 0::2, 1::2, :]  # [B, H/2, W/2, C]  对应图片所有 2 的位置
        x3 = x[:, 1::2, 1::2, :]  # [B, H/2, W/2, C]  对应图片所有 4 的位置
        x = torch.cat([x0, x1, x2, x3], -1)  # [B, H/2, W/2, 4*C] 拼在一起,通道变为4倍

		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]  self.reduction = nn.Linear(4*dim, 2*dim, bias=False)一个线性映射使通道变为2倍

2.create mask部分(有点懵)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ebc36327a9b84806b96d6d50c9f12dcd.png在这里插入图片描述
划分窗口
在这里插入图片描述

相同的数字是连续的区域
代码:

		h_slices = (slice(0, -self.window_size), #切片 [0,-3) 正着数是从第一个开始记为0,倒着数从最后一个开始记为-1
                    slice(-self.window_size, -self.shift_size),# [-3,-1)
                    slice(-self.shift_size, None))
        w_slices = (slice(0, -self.window_size),
                    slice(-self.window_size, -self.shift_size),
                    slice(-self.shift_size, None))
        cnt = 0
        for h in h_slices: # 给区域标号
            for w in w_slices:
                img_mask[:, h, w, :] = cnt
                cnt += 1
    # 划分window窗口
        mask_windows = window_partition(img_mask, self.window_size)  # [nW, Mh, Mw, 1]窗口个数,窗口宽,高,通道数
        mask_windows = mask_windows.view(-1, self.window_size * self.window_size)  # [nW, Mh*Mw]
        attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)  # [nW, 1, Mh*Mw] - [nW, Mh*Mw, 1]
        # [nW, Mh*Mw, Mh*Mw] 利用广播机制
        attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0))
        return attn_mask

3.window attention
相对位置编码
整体流程(摘自博客)
在这里插入图片描述
增加维度,下图图示【以下这些维度操作,就很amazing!!!】
在这里插入图片描述

利用广播机制相减,得到相对位置编码(摘自B导视频)
如下图中颜色对应的坐标相减
在这里插入图片描述
这是permute变换前后变化,从横纵坐标分离 到 横纵坐标和在一起
在这里插入图片描述

代码:

 # 相对位置编码
        # get pair-wise relative position index for each token inside the window
        #首先 生成绝对位置索引
        coords_h = torch.arange(self.window_size[0])
        coords_w = torch.arange(self.window_size[1])   # 生成网格坐标索引    堆叠
        coords = torch.stack(torch.meshgrid([coords_h, coords_w], indexing="ij"))  # [2, Mh, Mw]
        coords_flatten = torch.flatten(coords, 1)  # [2, Mh*Mw] 并展开为2D向量
        # coords_flatten[:, None, :] 在一维处插入新维度  , coords_flatten[:, :, None] 在二维处插入新维度
                                    # [2, Mh*Mw, 1] - [2, 1, Mh*Mw]  利用广播机制 就是通过相减得到他们的相对位置关系
        relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :]  # [2, Mh*Mw, Mh*Mw]
        relative_coords = relative_coords.permute(1, 2, 0).contiguous()  # [Mh*Mw, Mh*Mw, 2] 调换位置
        #把二元索引变成一元索引
        relative_coords[:, :, 0] += self.window_size[0] - 1  # 坐标转换为从0开始
        relative_coords[:, :, 1] += self.window_size[1] - 1
        relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 #行坐标乘(2M-1)
        relative_position_index = relative_coords.sum(-1)  # [Mh*Mw, Mh*Mw] 最后一个维度求和
        self.register_buffer("relative_position_index", relative_position_index) #注册为不参与网络学习的变量,
                                                    # #作用是根据最终的相对位置索引 找到对应的可学习的相对位置编码

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

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

相关文章

pve独显直连

目录折腾初步工作安装配置源去除订阅提示安装vim开启iommu屏蔽显卡驱动创建虚拟机体验折腾 买了个新笔记本,老的笔记本也没啥用了,挂二手平台也出不了多少钱。就想着自己折腾的新东西。之前有个PVE虚拟机感觉很不错,现在尝试一下怎么使用 初…

用HTML+CSS6音乐吧 7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

[附源码]SSM计算机毕业设计在线购物系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

英文版通信原理学习通题库

1、 能量信号的功率趋于( ) A、 无穷 B、 0 C、 非零值 答案: B 2、周期信号的频谱是( ) A、 连续谱 B、 离散谱 C、 既有连续谱,又有离散谱 答案: B 3、 信号的频谱如所示&…

第十三届蓝桥杯c++b组-积木画

题目描述 小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2 个单位面积)和 L 型(大小为 3 个单位面积): 同时,小明有一块面积大小为 2 N 的画布,画布…

云原生路由架构探索

以部署场景为中心的网络架构 网络技术的发展一直以来是以部署场景为中心,很多设备厂商也很自然的分成运营商 、数据中心 、企业网 、终端 等各个事业部。很多网络技术也是为了解决某个特定场景的问题而提出的。当然在这个过程中也相互借鉴,例如将MPLS V…

基于java+ssm教学质量评价系统(学生评教)-计算机毕业设计

项目介绍 教学质量是高等教育的生命线,提高教学质量是提高教育质量的前提,因此也是学校的首要任务。学生评价教师作为教师评教的重要途径,正在被很多学校采纳。学生评价教师体现了学校管理者对学生权利的尊重,以及促进师生沟通的…

Linux常见命令与Java环境部署

⭐️前言⭐️ 🍉博客主页: 🍁【如风暖阳】🍁 🍉精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、【数据结构】 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟&…

ijkplayer基于rtsp直播延时的深度优化

现在ijkPlayer是许多播放器、直播平台的首选,相信很多开发者都接触过ijkPlayer,无论是Android工程师还是iOS工程师。本文主要是总结,也是与大家探讨RTSP直播的延时优化。 目录 一、修改编译脚本支持RTSP 二、修改播放器的option参数 三、…

WEB基础

互联网简介 互联网是世界上最大的计算机网络 互联网被称为网络的网络 万维网是互联网中的一个子网 WWW包含分散在世界范围内的众多Web 服务器(World Wide Web)WEB web即全球广域网World Wide Web,也称万维网,是一种基于超文本和HT…

基于ssm+mysql+jsp作业管理(在线学习)系统

基于ssmmysqljsp作业管理(在线学习)系统一、系统介绍二、功能展示1.用户登陆2.用户注册3.在线学习(评论)--学生4.任务列表--学生5.我的作业--学生6.个人中心7.发布课程--老师8.发布任务--老师9.评阅作业10.后台管理--管理员一、系…

RabbitMQ初步到精通-第五章-RabbitMQ之消息防丢失

目录 第五章-RabbitMQ之消息防丢失 1.消息是如何丢的 ​编辑 2.如何控制消息丢失 2.1 生产者发送消息到Broker过程 2.2 Broker内部过程 2.2.1 Exchange发送至queue过程-Return机制 2.2.2 queue存储过程 2.3 消费者消费过程-消费端确认 3.最佳实践 第五章-RabbitMQ之消息…

养老服务系统设计与实现-计算机毕业设计源码+LW文档

基于SSM的养老服务系统设计与实现 摘 要 本养老服务系统就是建立在充分利用现在完善科技技术这个理念基础之上,并使用IT技术进行对养老服务的管理,从而保证系统得到充分利用,可以实现养老服务的在线管理,这样保证了资源共享效率的…

牛客刷题记录(常见笔试题)

目录 一、Map的应用篇 乒 乓球筐 简单的错误记录 二、动态规划篇 计算字符串的编辑距离 年终奖 最长不含重复字符的子字符串 合唱团 三、数组篇 顺时针打印矩阵 一、Map的应用篇 乒 乓球筐 题目地址:乒乓球筐 小白代码 import java.util.*;// 注意类名必…

一次就能释放大量Mac内存空间的方法,你用过哪种?

清理Mac内存空间对Mac的运行速度有着非常大的好处,所以合理释放Mac内存空间是广大用户常做的一件事。那么小编整理了一些能够一次性大量释放Mac内存空间的方法,大家常用的是哪一种呢?欢迎一起交流哦~以下: 一、清理MAC缓存&#x…

微信小程序|从零动手实现俄罗斯方块

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? …

[Linux]----进程间通信之管道通信

文章目录前言一、进程间通信目的二、进程间通信发展三、进程间通信分类四、管道1. 匿名管道2. 管道内核代码3. 站在文件描述符角度-深度理解管道4. 站在内核角度-管道本质5. 管道的特征总结五、命名管道1. 创建命名管道总结前言 首先我基于通信背景来带大家了解进程间通讯&…

HTTP协议详细总结

目录 1.HTTP协议是什么? 2.什么叫做应用层协议 3.HTTP协议的工作流程 4.HTTP报文格式 请求报文: 响应报文: 5.URL 6.方法的认识 1.GET 2.POST 3.GET和POST的区别 4.其他方法 7.报头的认识 用户登陆过程: 8.状态码的认识 9.HTTPS 9.1HTTPS是什么? 9.2HTTPS的…

现代c++中实现精确延时方法总结

程序中实现延时有很多种办法,但是有些不建议用。比如还在用sleep()或者空转计数的方式延时?要么移植性不好,要么不够精确且效率太低。这里总结下现代c中推荐的一种实现精确延时的方法。 之前的一些用法 粗暴空转 long wait 0; while(wait…

十二、Mysql的索引

Mysql的索引十二、Mysql的索引一、什么是索引二、常见索引的种类(算法)三、B树 基于不同的查找算法分类介绍1、B树结构2、B-树四、索引的功能性分类1、辅助索引(S)及构建B树结构2、聚集索引(C)及构建B树结构3、聚集索引和辅助索引构成区别4、关于索引树的高度受什么影响五、索引…