这个是一个常用的模块,就是我们可以对输入的特征嵌入位置编码。

位置编码(Positional Encoding)是一种将空间位置信息嵌入到特征中的方法,通常用于帮助模型更好地理解特征的空间关系。
这里介绍的这个是相对位置编码,代码如下:

def _make_coord(batch, height, width):xv, yv = torch.meshgrid([torch.arange(0, height), torch.arange(0, width)])xv_min = (xv.float() * 2 - width) / widthyv_min = (yv.float() * 2 - height) / heightxv_max = ((xv + 1).float() * 2 - width) / widthyv_max = ((yv + 1).float() * 2 - height) / heightxv_ctr = (xv_min + xv_max) / 2yv_ctr = (yv_min + yv_max) / 2hmap = torch.ones(height, width) * (1. / height)wmap = torch.ones(height, width) * (1. / width)coord = torch.cat([xv_min.unsqueeze(0), yv_min.unsqueeze(0),xv_max.unsqueeze(0), yv_max.unsqueeze(0),xv_ctr.unsqueeze(0), yv_ctr.unsqueeze(0),hmap.unsqueeze(0), wmap.unsqueeze(0)], dim=0)coord = coord.unsqueeze(0).repeat(batch, 1, 1, 1)return coord

这个模块怎么用?
比如说你现在特征大小是2x64x4x4,batchsize是2,通道数64,宽和高是4
给定参数宽和高就可以生成位置编码,生成的位置编码是8维的,然后直接复制到跟batchsize保持一致就行
就得到了bx8xHxW的位置编码,然后直接和特征进行拼接,拼接完了直接卷积融合就行,就可以实现位置编码的嵌入

解释一下这个模块:
根据代码来讲解

我们假设特征

batch_size = 2  # 批量大小
height = 4      # 特征图高度
width = 4       # 特征图宽度

首先

xv, yv = torch.meshgrid([torch.arange(0, height), torch.arange(0, width)])
# 生成两个网格矩阵 xv 和 yv,分别表示每个像素的横坐标和纵坐标。

可能有点抽象,具体来说

xv如下(每一个位置的数代表该位置像素的横坐标)

[0,0,0,0],
[1,1,1,1],
[2,2,2,2],
[3,3,3,3]

yv如下(每一个位置的数代表该位置像素的纵坐标)

[0,1,2,3],
[0,1,2,3],
[0,1,2,3],
[0,1,2,3]

随后就是

	xv_min = (xv.float() * 2 - width) / widthyv_min = (yv.float() * 2 - height) / height

这个计算就是进行相对位置编码,前面两行的计算公式:(xv.float() * 2 - width) / width这就是将坐标映射到[-1,1)上去,注意,左闭右开,不会映射到1,因为从0开始的。

	xv_max = ((xv + 1).float() * 2 - width) / widthyv_max = ((yv + 1).float() * 2 - height) / height

那么这个max也是一样,这个是映射到(-1,1]上去

最终得到的矩阵如下:

xv_min如下

[-1  ,-1  ,-1  ,-1  ],
[-0.5,-0.5,-0.5,-0.5],
[0   ,0   ,0   ,0   ],
[0.5 ,0.5 ,0.5 ,0.5 ]

yv_min如下

[-1 ,-0.5 ,0 ,0.5 ],
[-1 ,-0.5 ,0 ,0.5 ],
[-1 ,-0.5 ,0 ,0.5 ],
[-1 ,-0.5 ,0 ,0.5 ]

xv_max如下

[-0.5,-0.5,-0.5,-0.5],
[0   ,0   ,0   ,0   ],
[0.5 ,0.5 ,0.5 ,0.5 ],
[1   ,1   ,1   ,1   ]

yv_max如下

[-0.5 ,0 ,0.5 ,1 ],
[-0.5 ,0 ,0.5 ,1 ],
[-0.5 ,0 ,0.5 ,1 ],
[-0.5 ,0 ,0.5 ,1 ]

这个东西的意义是什么?就是你把xv_minyv_min组合起来,左上角为[-1,-1],其余坐标都是相对左上角的坐标。

你把xv_maxyv_max组合起来,右下角为[1,1],其余坐标都是相对右下角的坐标。

xv_minyv_min 表示每个像素相对于左上角的坐标,xv_maxyv_max 表示每个像素相对于右下角的坐标。

紧接着,是计算每个像素的中心坐标,即像素的几何中心位置。

xv_ctr = (xv_min+xv_max)/2
yv_ctr = (yv_min+yv_max)/2

这个计算出来得到的是相对中心值,就是你相对左上角的值加上相对右下角的值,除以2,就是个平均值,就是中间的值

xv_ctr如下

[-0.75,-0.75,-0.75,-0.75],
[-0.25,-0.25,-0.25,-0.25],
[0.25 ,0.25 ,0.25 ,0.25 ],
[0.75 ,0.75 ,0.75 ,0.75 ]

yv_ctr如下

[-0.75,-0.25,0.25,0.75],
[-0.75,-0.25,0.25,0.75],
[-0.75,-0.25,0.25,0.75],
[-0.75,-0.25,0.25,0.75]

然后下面两行,这个计算的就是宽度步长和高度步长,换句话说:分别表示每个像素的高度和宽度的归一化值。

hmap = torch.ones(height, width) * (1. / height)
wmap = torch.ones(height, width) * (1. / width)

计算出来hmapwmap都如下所示,一样的,因为设置的宽高是一样的,1/4都是0.25

[0.25,0.25,0.25,0.25],
[0.25,0.25,0.25,0.25],
[0.25,0.25,0.25,0.25],
[0.25,0.25,0.25,0.25]

将上述计算的 8 个通道(xv_min, yv_min, xv_max, yv_max, xv_ctr, yv_ctr, hmap, wmap)拼接在一起,形成一个 8×H×W 的张量。

使用 unsqueeze(0) 将其扩展为 1×8×H×W,然后通过 repeat(batch, 1, 1, 1) 将其复制到每个样本上,最终得到一个 B×8×H×W 的张量。

这个 8 维位置编码包含了以下信息:

  1. 每个像素左上角的归一化坐标(xv_min, yv_min)。
  2. 每个像素右下角的归一化坐标(xv_max, yv_max)。
  3. 每个像素中心的归一化坐标(xv_ctr, yv_ctr)。
  4. 每个像素的相对高度和宽度(hmap, wmap)。

这些信息为模型提供了丰富的空间位置信息,有助于模型更好地理解特征图中像素之间的空间关系。

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

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

相关文章

osg加入实时光照SilverLining 天空和3D 云

OSG系列文章目录 文章目录 OSG系列文章目录一、前言官网的介绍: 二、编译官网例子 一、前言 osg本身也可以加入动态云,但是效果有点差强人意,这里我们使用sundog公司的动态云:SilverLining 天空和 3D 云。 官网的介绍&#xff1…

spring-ai-alibaba 1.0.0.2 学习(十二)——聊天记忆扩展包

学习spring-ai时提到过,spring-ai除了内置的InMemoryChatMemoryRepository,还提供jdbc、cassandra、neo4j三个扩展包。 而spring-ai-alibaba则提供了jdbc、redis、elasticsearch三个扩展包。 两者都提供了jdbc扩展包,有什么区别呢&#xff…

c语言-指针(数组)练习2

题目:将数组中n个元素按逆序存放并打印出来,使用函数封装与指针 思路: 1.定义一个数组arr[5]和用于存放数组大小(数组大小通过sizeof关键字来进行计算)的变量len; 2.创建三个函数initArr、printArr、rev…

Redis服务器

Redis,一款Key-Value型内存数据库 常用于网站开发场景 Redis服务器只发布了Linux版本 Redis服务器安装,2种办法 自动安装 apt install redis-server手动编译安装 从官网下载源码,编译,部署 1 安装redis apt install redis-s…

LeetCode 第91题:解码方法

题目描述: 一条包含字母A-Z的消息通过以下映射进行了编码 1-A ...... 26-Z 要特别注意,11106可以映射为AAJF或KJF 06不是一个合法编码 给你一个只含数字的非空字符串s,请计算并返回解码方法的总数。如果没有合法的方法解码整个字符串&#xf…

Rocky Linux 9 源码包安装Mysql8

Rocky Linux 9 源码包安装Mysql8 大家好我是星哥,之前介绍了,Rocky Linux 9 源码包安装Mysql5.7。 本文将介绍如何在Rocky Linux 9操作系统上,从源码一步步安装MySQL 8,为您提供一个稳定、高效且可控的数据库解决方案。 为什么…

AI小智项目全解析:软硬件架构与开发环境配置

AI小智项目全解析:软硬件架构与开发环境配置 一、项目整体架构 AI小智是一款基于ESP32的智能物联网设备,集成了语音交互、边缘计算等功能。整体系统架构如下: 终端设备:ESP32模组作为核心通信方式: WebSocket实现实…

设计模式之上下文对象设计模式

目录 一、模式介绍 二、架构设计 三、Demo 示例 四、总结 一、模式介绍 上下文对象(Context Object)模式 最早由《Core J2EE Patterns》第二版提出,其核心目标是在多层或多组件间共享与当前作用域(如一次请求、一次会话、一次…

@Linux服务器加域退域

文章目录 **一、加入Active Directory域****1. 准备工作****2. 配置步骤****步骤1:验证网络和DNS****步骤2:发现域****步骤3:加入域****步骤4:配置SSSD(可选)****步骤5:配置sudo权限&#xff08…

鸿蒙系统(HarmonyOS)4.2 设备上实现无线安装 APK 并调试

在鸿蒙系统(HarmonyOS)4.2 设备上实现无线安装 APK 并调试的步骤与 Android 类似,但需注意鸿蒙系统的特殊设置。以下是详细操作指南: 鸿蒙系统特殊准备 开启开发者选项: - 设置 > 关于手机 > 连续点击"H…

MyBatis时间戳查询实战指南

在 MyBatis 中通过时间戳(Timestamp)作为查询条件,需注意数据库时间类型与 Java 类型的映射。以下是具体实现方式: 一、Java 实体类与数据库字段映射 实体类定义 使用 java.sql.Timestamp 或 java.time.LocalDateTime(…

【Verilog硬件语言学习笔记4】FPGA串口通信

串口通信是系统设计中比较基部分,其原理其实也很通俗易懂。单次建立通信会传输8个bit,其时序也很简单,这里就不再赘述了。其对应的实例代码如下所示; 首先是接受部分(因为我的变量命名也很规范,通俗易懂&a…

Go 语言安装教程(Windows 系统)

2025年07月02日 准备工作 确认系统为 Windows 7 及以上版本(推荐 Windows 10/11)。64 位系统选择 amd64 版本安装包,32 位系统选择 386 版本。确保安装目录(默认 C:\Program Files\Go\)有至少 1GB 空间。 下载安装包…

接口测试之postman

一、Postman功能简介 3天精通Postman接口测试,全套项目实战教程!! Postman是由Postdot Technologies公司打造的一款功能强大的调试HTTP接口的工具。在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各…

【记录】Ubuntu安装Mysql

本文记录Ubuntu系统下安装Mysql 1 查看系统信息 lsb_release -a 2 使用apt下载安装Mysql 1 打开终端,首先更新你的系统包索引,以确保所有包都是最新的 sudo apt update 2 安装mysql服务器 sudo apt install mysql-server (也可以选择对应的mysql-server 版本) 3 查看mysql状…

【深度学习:进阶篇】--4.1.循环神经网络(改进)

RNN存在的问题:梯度爆炸,长期依赖参数量过大等问题 目录 1.GRU(门控循环单元) 1.1.什么是GRU 1.2.直观理解 1.3.本质解决问题 2.LSTM(长短记忆网络) 2.1.作用 3.结构扩展与效率优化​ 1.GRU(门控循环单元) 2014年,出现的算法&#x…

中心化钱包安全方案

先来看独立的密钥安全技术 1 自建或单租户 CloudHSM 优点:密钥永不出硬件,无法导出,只能对外提供公钥。 交易时,外部应用把消息哈希传进去签名,再把签好名的结果拿出来用。 这种方式安全性拉满,但成本高、…

Android 实现底部弹窗

文章目录在 Android 中创建优雅的底部选项弹窗 (BottomSheetDialogFragment) 📱第一步:设计底部弹窗的布局 🎨第二步:创建 BottomSheetDialogFragment 类 ⚙️第三步:触发并显示底部弹窗 🚀在 Android 中创…

LAN8720 寄存器概览和STM32 HAL库读写测试

目录 寄存器0x00:Basic Control Register(BCR)0x01:Basic Status Register(BSR) 连接测试寄存器读写测试 补充 寄存器 // 0x00:Basic Control Register(BCR) BIT15:Soft Reset 写1复位,写1之…

渗透测试深度分析:空密码Administrator账户引发的安全风暴

渗透测试深度分析:空密码Administrator账户引发的安全风暴0x01 测试背景 在内网渗透测试中,对Windows主机 192.168.1.98 使用 enum4linux 进行枚举: enum4linux -u Administrator -p -a 192.168.1.98关键发现:Administrator账户空…