图解PyTorch中的torch.gather函数和 scatter 函数
前言
torch.gather在目前基于 transformer or query based 的目标检测中,在最后获取目标结果时,经常用到。
这里记录下用法,防止之后又忘了。
介绍
torch.gather

官方文档对torch.gather()的定义非常简洁
定义:从原tensor中获取指定dim和指定index的数据
看到这个核心定义,我们很容易想到gather()的基本想法其实就类似从完整数据中按索引取值般简单,比如下面从列表中按索引取值
lst = [1, 2, 3, 4, 5]
value = lst[2] # value = 3
value = lst[2:4] # value = [3, 4]
上面的取值例子是取单个值或具有逻辑顺序序列的例子,而对于深度学习常用的批量tensor数据来说,我们的需求可能是选取其中多个且乱序的值,此时gather()就是一个很好的tool,它可以帮助我们从批量tensor中取出指定乱序索引下的数据,因此其用途如下
用途:方便从批量tensor中获取指定索引下的数据,该索引是高度自定义化的,可乱序的
示例
我们找个3x3的二维矩阵做个实验
import torchtensor_0 = torch.arange(3, 12).view(3, 3)
print(tensor_0)
输出结果
tensor([[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
2.1 输入行向量index,并替换行索引(dim=0)
index = torch.tensor([[2, 1, 0]])
tensor_1 = tensor_0.gather(0, index)
print(tensor_1)
输出结果
tensor([[9, 7, 5]])
过程如图所示

2.2 输入行向量index,并替换列索引(dim=1)
index = torch.tensor([[2, 1, 0]])
tensor_1 = tensor_0.gather(1, index)
print(tensor_1)
输出结果
tensor([[5, 4, 3]])
过程如图所示

2.3 输入列向量index,并替换列索引(dim=1)
index = torch.tensor([[2, 1, 0]]).t()
tensor_1 = tensor_0.gather(1, index)
print(tensor_1)
输出结果
tensor([[5],[7],[9]])
过程如图所示

scatter
基本是 gather 的反过程,是将数据添加进去,
doc:https://pytorch.org/docs/stable/generated/torch.Tensor.scatter_.html#torch.Tensor.scatter_
self[index[i][j][k]][j][k] = src[i][j][k] # if dim == 0
self[i][index[i][j][k]][k] = src[i][j][k] # if dim == 1
self[i][j][index[i][j][k]] = src[i][j][k] # if dim == 2
example:
>>> src = torch.arange(1, 11).reshape((2, 5))
>>> src
tensor([[ 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10]])
>>> index = torch.tensor([[0, 1, 2, 0]])
>>> torch.zeros(3, 5, dtype=src.dtype).scatter_(0, index, src)
tensor([[1, 0, 0, 4, 0],[0, 2, 0, 0, 0],[0, 0, 3, 0, 0]])
>>> index = torch.tensor([[0, 1, 2], [0, 1, 4]])
>>> torch.zeros(3, 5, dtype=src.dtype).scatter_(1, index, src)
tensor([[1, 2, 3, 0, 0],[6, 7, 0, 0, 8],[0, 0, 0, 0, 0]])>>> torch.full((2, 4), 2.).scatter_(1, torch.tensor([[2], [3]]),
... 1.23, reduce='multiply')
tensor([[2.0000, 2.0000, 2.4600, 2.0000],[2.0000, 2.0000, 2.0000, 2.4600]])
>>> torch.full((2, 4), 2.).scatter_(1, torch.tensor([[2], [3]]),
... 1.23, reduce='add')
tensor([[2.0000, 2.0000, 3.2300, 2.0000],[2.0000, 2.0000, 2.0000, 3.2300]])
具体过程见 gather 的就好~一摸一样,一个获取,一个填入。
相关文章:
图解PyTorch中的torch.gather函数和 scatter 函数
前言 torch.gather在目前基于 transformer or query based 的目标检测中,在最后获取目标结果时,经常用到。 这里记录下用法,防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义:从原tensor中获…...
Pytorch实用教程: torch.tensor()的用法
在PyTorch中,torch.tensor()函数是用来创建张量(Tensor)的一个非常基础和重要的函数。张量是PyTorch中的基本数据结构,用于存储和操作数据,可以看作是一个高维数组。torch.tensor()函数可以从数据创建新的张量…...
Java设计模式详解:工厂模式
Java设计模式详解:工厂模式 文章目录 Java设计模式详解:工厂模式前言一、工厂模式是个啥?二、工厂模式怎么用?三、工厂模式啥时候用?四、工厂模式的优点总结 前言 今天咱们来聊聊设计模式中的一位重要成员——工厂模式…...
Python爬虫:爬虫常用伪装手段
目录 前言 一、设置User-Agent 二、设置Referer 三、使用代理IP 四、限制请求频率 总结 前言 随着互联网的快速发展,爬虫技术在网络数据采集方面发挥着重要的作用。然而,由于爬虫的使用可能会对被爬取的网站造成一定的压力,因此&#…...
【数据结构】非线性结构---二叉树
1、树 1.1 树的相关概念 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…...
【战略前沿】与中国达成生产协议后,飞行汽车即将起飞
【原文】Flying cars edge towards takeoff after Chinese production deal 【作者】Thomas Macaulay 斯洛伐克公司KleinVision签署了一项协议,将大规模生产AirCar。 一辆获得航空认证的飞行汽车向商业化又迈出了一大步。 空中汽车的创造者KleinVision今天宣布出售…...
谷粒商城实战(007 压力测试)
Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第141p-第p150的内容 简介 安装jmeter 安装jmeter 使用中文 这样写就是200个线程循环100次 一共是2万个请求 介绍线程组 添加请求 可以是htt…...
使用CSS计数器,在目录名称前加上了序号,让目录看起来更加井然有序
目录(Text of Contents缩写为TOC),其实就是一篇文章的概要或简述。这好比,去书店买书,先是被这本书的标题所吸引,而后我们才会,翻开这本书目录,看看这本书主要是在讲些什么ÿ…...
SSH常见运维总结
1 -bash: ssh: command not found 解决办法:"yum install -y openssh-server openssh-clinets" 2 ssh登录时提示:Read from socket failed: Connection reset by peer. 原因:/etc/ssh/下没有ssh*key*文件 解决&…...
uni app 扫雷
闲来无聊。做个扫雷玩玩吧,点击打开,长按标记,标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…...
MATLAB绘制堆叠填充图--巧用句柄
MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…...
JQuery的定义
jQuery是一个js库,使用jQuery会比js简单一点 jQuery文件是一个自执行函数 jQuery文件是一个自执行函数 $传递的参数不同,效果也不同: 传递的是匿名函数,那$就是一个入口函数,传递的是一个字符串,那$就…...
【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码
文章目录 一、先来先服务调度算法(FCFS) 二、短作业优先调度算法(SJF) 三、高响应比优先调度算法(HRRN) 四、轮转调度算法(RR) 五、最早截至时间优先算法(EDF&#…...
Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)
1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果,但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下,深度学习模型的适应程度变低,检测结果也随之下降,因此研究在复杂气象条件下的目标检测方法…...
Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告
Jenkins支持的JDK版本17、21,通过java -version查看当前JDK版本,确认是否匹配 打开网址https://www.jenkins.io/download 点击下载,选择mac版本 commend空格打开终端,输入安装命令brew install jenkins 安装完成后输入brew servi…...
redis-Hash
一,应用场景 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。 二,命令 H…...
Kubernetes kafka系列 | Strimzi 部署kafka-bridge
Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件,用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台,广泛用于构建实时数据流水线和流式应用程序。然而…...
AR和VR如何改变客户体验?
How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…...
微信小程序中实现埋点的方法
在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…...
vue记事本渲染以及交互
以下是记事本的源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本</title><styl…...
VisualCppRedist AIO:一站式解决Windows应用程序运行库缺失难题
VisualCppRedist AIO:一站式解决Windows应用程序运行库缺失难题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 在Windows系统中,你是否经…...
网安信息收集
声明:任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全 的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安…...
从 Token 消耗到 AI 资产:企业如何把一次调用沉淀成模板、流程、知识库和制度
关键词:Token 管理、AI 资产、模板库、流程化、知识库、制度化、投入产出比 开篇:企业真正要管的不是 Token,而是 Token 之后留下了什么 很多企业开始使用 AI 以后,第一反应是看成本:这个月用了多少 Token,哪个部门调用最多,哪个模型最贵,哪些场景消耗最高。 这当然重…...
Codex入门09-Git工作流(小白入门:不会写commit信息?AI帮你自动生成规范提交)
🎯 本文目标 学会用 Codex 自动化 Git 操作:提交、冲突解决、PR 描述生成。 😰 Git 新手的典型痛点 你的提交记录是不是这样的: git log --oneline a3f4b2c fix 9d1e8c4 update 4c7b91f 修改了一些东西 f0a2d3e 。。。 b5c8e7a 又改了这就是"屎山提交记录"—…...
原神帧率解锁技术解析:三步突破60FPS限制的完整方案
原神帧率解锁技术解析:三步突破60FPS限制的完整方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否曾为《原神》PC版的60FPS限制感到困扰?当你的高性能显卡…...
喜马拉雅VIP音频下载指南:xmly-downloader-qt5完整解决方案
喜马拉雅VIP音频下载指南:xmly-downloader-qt5完整解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否曾为…...
Open UI5 源代码解析之1378:DestinationField.js
源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.ui.integration\src\sap\ui\integration\editor\fields\DestinationField.js DestinationField.js 文件分析 文件定位与整体判断 DestinationField.js 是 sap.ui.integration 编辑器体系中的一个专用字段…...
音频AI DSP:低功耗边缘智能的硬件架构与实现
1. 项目概述:当音频AI遇见边缘DSP几年前,如果有人告诉我,一个比指甲盖还小的芯片,能在不到1毫瓦的功耗下,持续监听环境声音、识别特定关键词,甚至能分辨出你是在嘈杂的餐厅还是在安静的办公室,我…...
后端程序员必看:3-6个月从0到1转型高薪AI应用
本文针对传统后端程序员想转型AI应用开发的焦虑,提出了一条省时、高薪、稳定的转型路线。文章指出,转型AI应用开发的核心是复用后端优势,走“后端AI集成”的复合型路线,而非死磕底层算法。文章详细规划了3-6个月的转型路线&#x…...
基于VitePress构建开源AI智能体框架深度中文文档站实战指南
1. 项目概述:一个为AI智能体框架量身打造的中文文档站如果你正在寻找一个能帮你把Claude、GPT这些大模型快速接入到微信、Telegram、飞书等聊天软件的开源框架,那你大概率会接触到OpenClaw(原名ClawdBot)。但当你兴冲冲地打开官方…...
