Pytorch基础 - 8. scatter() / scatter_() 函数

news2025/1/21 0:52:44

目录

1. scatter() 定义和参数说明

2. 示例和详细解释

3. scatter() 常见用途


1. scatter() 定义和参数说明

scatter() 或 scatter_() 常用来返回根据index映射关系映射后的新的tensor。其中,scatter() 不会直接修改原来的 Tensor,而 scatter_() 直接在原tensor上修改。

官方文档:torch.Tensor.scatter_ — PyTorch 2.0 documentation

 参数定义:

  • dim:沿着哪个维度进行索引
  • index:索引值
  • src:数据源,可以是张量,也可以是标量

简言之 scatter() 是通过 src 来修改另一个张量,修改的元素值和位置由 dim 和 index 决定

2. 示例和详细解释

在官方文档中,给出了3维tensor的具体操作说明,看起来很蒙,没关系继续往下看

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

 接下来的示例,我们以2维为例,那上面的公式简化为如下,

self[index[i][j]][j] = src[i][j]  # if dim == 0
self[i][index[i][j]] = src[i][j]  # if dim == 1

示例:将全零的张量,根据index和scr进行值的变化

src = torch.arange(1, 11).reshape((2, 5))
# src: tensor([[0.8351, 0.2974, 0.9028, 0.4250, 0.0370],
#              [0.4564, 0.6832, 0.6854, 0.6056, 0.7118]])
    
index = torch.tensor([[0, 1, 2, 0, 0], [0, 1, 4, 2, 3]])
dist = torch.zeros(2, 5, dtype=src.dtype).scatter(1, index, src)
    
# dist: tensor([[0.0370, 0.2974, 0.9028, 0.0000, 0.0000],
#               [0.4564, 0.6832, 0.6056, 0.7118, 0.6854]])

将上述张量使用表格表示: 

当 dim = 1时,dist[i[index[i][j]] = src[i][j],所以具体的计算如下

  • i=0, j=0时,dist[0][index[0][0]] = src[0][0], dist[0][1] = 0.8351
  • i=0, j=1时,dist[0][index[0][1]] = src[0][1], dist[0][0] = 0.2974
  • i=0, j=2时,dist[0][index[0][2]] = src[0][2], dist[0][2] = 0.9028
  • i=0, j=3时,dist[0][index[0][3]] = src[0][3], dist[0][4] = 0.4250
  • i=0, j=4时,dist[0][index[0][4]] = src[0][4], dist[0][3] = 0.0370
  • i=1, j=0时,dist[1][index[1][0]] = src[1][0], dist[1][0] = 0.4564
  • i=1, j=1时,dist[1][index[1][1]] = src[1][1], dist[1][1] = 0.6832
  • i=1, j=2时,dist[1][index[1][2]] = src[1][2], dist[1][4] = 0.6854
  • i=1, j=3时,dist[1][index[1][3]] = src[1][3], dist[1][2] = 0.6056
  • i=1, j=4时,dist[1][index[1][4]] = src[1][4], dist[1][3] = 0.7118

当 dim = 0时,赋值方式不同,即dist[index[i][j]][j] = src[i][j],计算的过程与上述同理,不再赘述

当 src 为标量时,更为简单。因为全部都用该标量值进行赋值即可 

3. scatter() 常见用途

scatter() 常用来对标签进行 one-hot 编码

注意:label的类型是torch.LongTensor

class_num, batch_size = 10, 4
label = torch.tensor([[6], [0], [3], [2]], dtype=torch.long)
one_hot = torch.zeros(batch_size, class_num).scatter(1, label, 1)
print(one_hot)
# tensor([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
#        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]])

这个程序比较好理解,dim =1, label = index, src = 1 ,所以

  • dist[0][label[0][0]] = dist[0][6] = 1
  • dist[1][label[1][0]] = dist[1][0] = 1
  • dist[2][label[2][0]] = dist[2][3] = 1
  • dist[3][label[3][0]] = dist[3][2] = 1

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

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

相关文章

元宇宙:虚拟仿真技术的全面提升

在当今数字化的世界中,我们经常听到虚拟现实、增强现实、混合现实等技术的名词,这些技术的应用越来越成熟。其中,虚拟仿真技术是一种通过计算机技术来模拟实际场景和对象的过程,它为我们提供了更多的可能性。而最近备受瞩目的元宇…

减震无人船或波浪自适应无人船

最近我的朋友夏先生介绍了一款他们自己正在研发的一款无人减震船,见下图,与以前无人船相比,它增加了悬挂减震系统(图中红框内)。 现有无人船大多属于中小型船舶,没有完善的减震减摇系统,减震减摇…

MIPI 打怪升级之DBI篇

目录1 Overview2 Display Architectures2.1 Type 1 Display Architecture Block Diagram2.2 Type 2 Display Architecture Block Diagram2.3 Type 3 Display Architecture Block Diagram2.4 Type 4 Display Architecture Block Diagram3 Interface Signal Description3.1 Type …

202306读书笔记|《与诗书在一起》——质而实绮,癯而实腴

《与诗书在一起》作者叶嘉莹,不错的一本书,大多只看了诗,部分读着比较有感觉的看了注释。 很喜欢的节选如下: 苏轼说陶渊明的诗“质而实绮,癯而实腴”,就是看起来它很简单质朴,内里实在是很美丽很丰富。 …

VS2010编译libcurl库并简单使用(c语言)

libcurl是什么? libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。 libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议…

Spring 之依赖注入底层原理

Spring 框架作为 Java 开发中最流行的框架之一,其核心特性之一就是依赖注入(Dependency Injection,DI)。在Spring中,依赖注入是通过 IOC 容器(Inversion of Control,控制反转)来实现…

助力研发效能变革,第七届Techo TVP 开发者峰会圆满落下帷幕

引言 在互联网数字企业结束“野蛮扩张”、追求高质量增长的今天,研发效能已然成为企业关注的核心命题。伴随着云原生概念在软件领域的落地生根,云原生正驱动软件应用设计、实现、部署及运维方式的巨变,为研发效能治理带来了新的挑战与机遇&am…

2022国赛31:虚拟化-------安装docker

大赛试题内容: 八、虚拟化(20) 在Windows3安装docker,导入NanoServer镜像。软件包和镜像存放在物理机D:\soft\DockerWindows。创建名称为web的容器,映射虚拟机的80端口到容器的80端口,容器启动后运行cmd命令,保持容器处于运行状态。解答过程: windows docker 安装 1.添…

知识图谱嵌入方法-transE

目录 一、知识图谱嵌入 二、transE算法 三、缺点 一、知识图谱嵌入 知识图谱(Knowledge Graph,KG) 是大规模语义网络知识库,利用三元组(实体,关系,实体)来描述具体的知识,其具有语义丰富、结…

vue-element-admin 动态菜单改造

vue-element-admin 动态菜单改造 vue-element-admin 是一款优秀后台前端解决方案,它基于 vue 和 element-ui实现。开源后台管理系统解决方案项目 Boot-admin的前端模块就是基于vue-element-admin开发而来。 作为一款纯前端的后台界面解决方案,vue-elem…

剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对 难度:hard\color{red}{hard}hard 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7…

怎么设计秒杀系统?

秒杀系统需要考虑哪些要素? 要能支持高并发用户体验要好,不要返回异常信息对系统要友好(针对秒杀可以做业务上的隔离,单独把秒杀系统部署到独立的集群服务器上;可动态配置业务参数,比如商品金额&#xff0…

电磁兼容(EMC)的标准与测试内容

在国际范围上,电磁兼容标准的制定已经有了70多年的发展历程,最早为了保护无线电通信和广播,国际无线电干扰特别委员会(CISPR)对各种用电设备和系统提出了相关的电磁干扰发射限值和测量方法。到了20世纪60~7…

机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

目录 一、简介和环境准备 简介: 环境: 二、实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入、分析 2.模型训练、预测 三、原…

TiDB进阶篇-TiDB Server架构

简介 较深入的介绍TiDB Server。 TiDB Server 架构 图解 1.下面是负责SQL语句的解析和优化。 2.下面试负责TiKV存储多版本,过期版本的清理作用。 3.复杂SQL的拆分(如果是点查那么就不需要经过DistSQL)。 4.事务相关。 5.负责PD和TiKV的通信…

js 事件流程

描述 JavaScript 的执行是单线程的,后面的任务需要等待前面的任务完全完成后,再去执行。DOM 事件(文件的加载等)、定时器、网络请求等事件,并不会消耗 CPU,这些事件无需等候,所以出现了异步。主…

Java后端新人入职第一天,环境搭建,全看这篇就行了

本文主要是记录一下一个新人java后端开发来到一个新公司,如何快速将自己的相关开发环境搭建好,包括Java、Maven、Tomcat、idea、Redis、Mysql等等,有的公司会有相关版本的要求,不过安装配置步骤基本一样的,我这里就以目前比较流行的版本进行详细说明。 一:基础环境搭建:…

Arduino开发之如何连接GPS模块?

文章目录0、引言1、GPS模块说明2、接调试助手测试GPS模块接收数据3、代码编写4、功能演示0、引言 NEO-6M/7M GPS模块,具有高灵敏度、低功耗、小型化、高追踪灵敏度,大大扩大了其定位的覆盖面,在普通GPS接收模块不能定位的地方,如狭…

编译原理考试大题分析【太原理工大学】

有些基本公式可以看这里,大题内容请以本篇为准!https://blog.csdn.net/m0_52861684/article/details/130071191?spm1001.2014.3001.5501 之前说错了,考试题型没有简答题和填空题,只有十个选择题是 20 分,其余全是大题…

ESP32设备驱动-VEML6075紫外线(UV)光传感器驱动

VEML6075紫外线(UV)光传感器驱动 文章目录 VEML6075紫外线(UV)光传感器驱动1、VEML6075介绍2、硬件准备3、软件准备4、驱动实现1、VEML6075介绍 VEML6075 可感应 UVA 和 UVB 光,并使用 CMOS 工艺将光电二极管、放大器和模拟/数字电路集成到单个芯片中。 应用 UV 传感器时,它…