pytorch里torch.gather()和torch.Tensor.scatter()解析

news2024/11/16 7:33:08

torch.Tensor.scatter() 类似 gather 的反向操作(gather是读出数据,scatter是写入数据),所以这里只解析torch.gather()。
gather()这个操作在功能上较为反人类,即使某段时间理解透彻了,过了几个月不碰可能又会变得生疏。官方文档对其描述也是较为简单,有些小伙伴看完可能还是不完全理解,本文从根本上去解析这个操作的功能。
概括地说,gather()是index_select()的延伸操作,比index_select()更加灵活,它的操作不属于块操作,而是元素级别的操作,所以性能上应该较低,我们应该尽可能地避免使用这个操作。

下面开始解析这个操作。

torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor

这个功能的设计目的是“Gathers values along an axis specified by dim.”,这是官方文档的所有描述,看到这句话做目标检测的小伙伴应该能想到这样一个场景:

目标检测网络输出矩阵,前4列是box的坐标,第5列表示检测到目标的种类标签
print(pred)
tensor([[0.0080, 0.6403, 0.9865, 0.0158, 1.0000],
        [0.2742, 0.7470, 0.3837, 0.6689, 3.0000],
        [0.3260, 0.6683, 0.1888, 0.9525, 0.0000],
        [0.7989, 0.9154, 0.1040, 0.5538, 3.0000],
        [0.6746, 0.6193, 0.0161, 0.5166, 0.0000]])

现在我们要挑选出标签是3的所有检测目标框,

i = pred[:, 4].eq(3).nonzero().repeat(1, 4)
torch.gather(pred, 0, i)
tensor([[0.2742, 0.7470, 0.3837, 0.6689],
        [0.7989, 0.9154, 0.1040, 0.5538]])

gather()可以实现实现这种整行地抽取数据,但不是最优的实现方法,我们有更合适的实现方法,index_select()和下标索引:

i = pred[:, 4].eq(3).nonzero().squeeze()
pred.index_select(0, i)[:, :4]
tensor([[0.2742, 0.7470, 0.3837, 0.6689],
        [0.7989, 0.9154, 0.1040, 0.5538]])
        
# 下标索引方法        
pred[i, :4]
tensor([[0.2742, 0.7470, 0.3837, 0.6689],
        [0.7989, 0.9154, 0.1040, 0.5538]])

现在我们要进行更加复杂的数据抽取,输出张量的要求如下:

  • shape是2*2
  • 第0行的第0列对应原始数据pred的第0行第0列,第1列对应pred的第1行第1列,在图中红色元素
  • 第1行的第0列对应原始数据pred的第3行第0列,第1列对应pred的第2行第1列,在图中蓝色元素
    数据抽取

这时候index_selsect()无法实现,但gather()可以

index = torch.tensor([[0, 1],
				  	  [3, 2]])
torch.gather(pred, 0, index)
tensor([[0.0080, 0.7470],
        [0.7989, 0.6683]])

这个操作的规则如下:

  • 输出张量的shape和索引张量(index)相同

  • 除了dim指示的那个维度,其他所有的维度满足条件: index.size(d) <= input.size(d)

  • index和输入张量input的每个维度一一对应

  • 除了dim指示的那个维度,其他维度的input和output元素位置对应,当index.size(d) < input.size(d)时候,从最前面截取
    在这里插入图片描述
    在这里插入图片描述

  • dim指示的那个维度上数据根据index里具体元素指示的位置去定位

看起来还是不好理解的,好在这个函数的应用场景不多,到目前为止我还没遇到适合这个函数的应用场景,如果哪位小伙伴遇到了请评论区留言感激不尽。

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

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

相关文章

【java】LocalDate获取前一天日期

//获取前一天日期//写法一LocalDate yesterday2 LocalDate.now().minusDays(1);System.out.println(yesterday2);//写法二LocalDate yes1 LocalDate.now().plusDays(-1);System.out.println(yes1);//输入当前日期的年 月 日System.out.println(LocalDate.now().getYear());…

基于AidLux的自动驾驶智能预警应用方案

1. 自动驾驶感知算法及AidLux相关方案介绍 1.1自动驾驶 自动驾驶汽车&#xff0c;又称无人驾驶车、电脑驾驶车、无人车、自驾车&#xff0c;是一种需要驾驶员辅助驾驶或者完全不需要操控的车辆。作为自动化载具&#xff0c;自动驾驶汽车可以不需要人类操作即能感知环境及导航…

dvwa靶场通关(九)

第九关&#xff1a;Weak Session IDs&#xff08;弱会话IDs&#xff09; 当用户登录后&#xff0c;在服务器就会创建一个会话(session)&#xff0c;叫做会话控制&#xff0c;接着访问页面的时候就不用登录&#xff0c;只需要携带 Sesion去访问。 sessionID作为特定用户访问站…

领导力指南:高效带领产品设计团队,成就卓越绩效!

产品设计团队负责创造功能性、用户友好性和视觉吸引力的产品。产品设计过程是产品设计师和他们的团队遵循的一系列阶段&#xff0c;以帮助履行他们的角色和责任。在本文中&#xff0c;我们将探讨产品设计团队应该做些什么。 1、定义产品的愿景 创造一个成功产品的第一步是定义产…

prometheus监控Nacos

Nacos监控 &#x1f4da;概述 Nacos 0.8.0版本完善了监控系统&#xff0c;支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态&#xff0c;目前支持prometheus、elastic search和influxdb&#xff0c;下面结合prometheus和grafana如何监控Nacos&#xff0c;官网gra…

Java设计模式之创建型-单例模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色分析 四、案例分析 1、饿汉模式 2、懒汉模式&#xff08;线程不安全&#xff09; 3、懒汉模式&#xff08;线程安全&#xff09; 4、双重检索模式 5、静态内部类 6、枚举 五、总结 一、基础概念 单例模式确保一个类只有一个…

工厂能源管控系统

随着现代工业的发展&#xff0c;工厂能源消耗不断增加&#xff0c;能源成本成为企业生产经营的重要组成部分。为了降低能源消耗、提高生产效率和降低成本&#xff0c;越来越多的企业开始采用工厂能源管控系统。本文将从多个方面介绍工厂能源管控系统的全面内容。 一、工厂能源管…

增值税高,怎么办?节省税款的小技巧必知!

增值税高&#xff0c;怎么办&#xff1f;节省税款的小技巧必知&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 增值税是所有企业必须要去缴纳的一种税种&#xff0c;它对于企业来说十分熟悉。而企业增值税高的问题也不是…

两部搞定Pytorch 安装与配置(小白也能搞定!!!)

Pytorch 安装与配置 NVIDIA系统管理界面查看 nvidia-smi 进入NVIDIA系统管理界面 对应的详细解释看下图 参考博文 (53条消息) nvidia-smi命令详解和一些高阶技巧介绍_Chaos_Wang_的博客-CSDN博客 CUDA 查看 CUDA 有两类&#xff1a;其中一类是驱动API(Driver API)&#xff…

拥抱“Zero ETL”未来,亚马逊云科技助力乐城堡加速数据分析

获得全球三千五百多万用户的认可的移动游戏企业乐城堡希望通过数据分析为游戏业务提供更好的决策支撑。乐城堡在亚马逊云科技上利用Amazon Redshift等服务构建属于自己的云上游戏数据分析平台&#xff0c;实现复杂查询&#xff0c;保证游戏运营人员能快速、近实时地获取所需的数…

Python-opcua 编程(3)历史数据读写

历史数据就是将opcua 信息模型中的某一些变量保存起来&#xff0c;以便Client 端程序能够读取历史数据&#xff0c;作各种数据处理。 Opcua 标准指出历史数据的读写&#xff0c;主要包括&#xff1a; 属性 Historizing 当设置为True 时&#xff0c;该变量支持历史数据读写 …

kafka主题支持路由功能

背景&#xff1a; 我们知道rabbitmq是支持消息路由的功能的&#xff0c;但是当我们统一消息中间件到kafka后&#xff0c;有一些旧的应用依然想要使用消息路由的功能时&#xff0c;我们可以怎么让kafka也支持消息路由的功能呢&#xff1f; 技术实现&#xff1a; 为了不影响ka…

web实现小米商城首页选择内容

一、需求&#xff1a;实现如下图所示的web内容 二、实现结果 三、代码展示 <!DOCTYPE html> <html> <head><title>小米商场</title><style>body {display: flex;flex-direction: column;align-items: center;justify-content: center;he…

阿里云轻量应用服务器使用教程(以建站为例)

阿里云轻量应用服务器怎么使用&#xff1f;阿里云轻量应用服务器使用教程&#xff1a;轻量应用服务器购买、重置密码、远程连接、宝塔面板的Web环境搭建、WordPress网站程序安装到网站上线&#xff0c;阿里云服务器网分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服…

【SLAM】Ceres优化库超详细解析

Ceres是由Google开发的开源C通用非线性优化库&#xff0c;与g2o并列为目前视觉SLAM中应用最广泛的优化算法库。 对于任何一个优化问题&#xff0c;我们首先需要对问题进行建模&#xff0c;之后采用合适的优化方法&#xff0c;进行求解。在求解的过程中&#xff0c;往往需要进行…

用 Nginx 禁止国外 IP 访问我的网站...

先来说说为啥要写这篇文章&#xff0c;之前看了下 Nginx 的访问日志&#xff0c;发现每天有好多国外的 IP 地址来访问我的网站&#xff0c;并且访问的内容基本上都是恶意的。因此我决定禁止国外 IP 来访问我的网站。 想要实现这个功能有很多方法&#xff0c;下面我就来介绍基于…

(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】

❓ 132. 分割回文串 II 难度&#xff1a;困难 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;1 解释&#xff1a;只需一次分割就…

Vision Transformer (ViT)介绍

paper&#xff1a;An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 摘要 把transformer直接应用于图像块序列&#xff0c;也可以在图像分类任务上表现很好。通过在大数据集上预训练&#xff0c;然后迁移到中等规模和小规模数据集上&#xff0c;…

Android之签字板

文章目录 前言一、效果图二、实现步骤1.GestureSignatureView类2.xml布局3.Activity类(kotlin)4.Activity类(Java)5.动态申请权限(kotlin)6.动态申请权限(Java) 总结 前言 随着公司发展需求&#xff0c;很多金融APP都会涉及到需要用户签字的环节&#xff0c;所以在此贴出代码以…

软考高级架构师笔记-9系统架构

目录 1. 前文回顾 & 考情分析2. 软件架构概述3. 软件架构风格3.1 层次架构风格3.2 面向服务架构风格4. 软件架构复用5. 特定领域软件体系结构DSSA6. ABSD7. 质量属性8. 架构评估9 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师…