torch.gather(...)

1. Abstract

对于 pytorch 中的函数

torch.gather(input,  # (Tensor) the source tensordim,    # (int)    the axis along which to indexindex,  # (LongTensor) the indices of elements to gather*,sparse_grad=False,out=None
) → Tensor

有点绕,很多博客画各种图讲各种故事来解释如何input 张量中 gather 位置 index 处的值,乱七八糟,我是都没看明白。所以去官网看了文档:

out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

从这三行看,意思还是很明晰的:输出 out 和输入 input 之间的差别就是,把相应位置(dim)的下标替换成 index[i][j][k]dim=0,1,2 分别对应替换的位置0,1,2。但这不够直观!

【注】从上面三行代码可以看出,indexinput 的维度尺寸是一样的,即 len(index.shape) == len(input.shape),但不一定是相同的形状:index.shape[dim] ≠ input.shape[dim](其他维度的形状必须满足 index.shape <= input.shape)。

2. 图解

2.1 一维向量

先从简单的一维向量看看:

x = torch.tensor([3, 4, 5, 6, 7])

按规则看,out[i] = input[index[i]] # dim == 0,即,从向量里选取指定位置 index[i] 处的数字,放到输出向量 out[i] 处。这个很好理解,pythonnumpypytorch 都有这样的语法:

x = torch.randn(3)
index = torch.randint(low=0, high=3, size=(5,))
y = x[index]
print(x)
print(index)
print(y)
### output ###
tensor([ 0.8797,  0.2459, -0.1312])
tensor([2, 0, 2, 2, 0])
tensor([-0.1312,  0.8797, -0.1312, -0.1312,  0.8797])

torch.gather(...) 函数,就是这样的:

x = torch.tensor([3, 4, 5, 6, 7])
index = torch.tensor([4, 4, 1, 1, 0, 3])
out = torch.gather(x, dim=0, index=index)
### output ###
tensor([7, 7, 4, 4, 3, 6])

举例来说,上面的 index[4] = 0,那么它会寻找 input[index[4]] = input[0] = 3,然后放入 out[4]。这就是英文单词 gather 的意思。

index 的长度是不受限制的,即 gather 多少元素都可以。

小结:在一维向量下,out = torch.gather(x, dim=0, index=index) 等价于 out = x[index]

2.2 二维矩阵

往上升一个维度,看看对二维矩阵实施 gather 函数的操作:

x = torch.tensor([[3, 4, 5, 6, 7], [9, 8, 7, 6, 5]])
idx = torch.randint(low=0, high=5, size=(2, 6))
y = torch.gather(x, dim=1, index=idx)
print(x)
print(idx)
print(y)
### output ###
tensor([[3, 4, 5, 6, 7],[9, 8, 7, 6, 5]])
tensor([[4, 4, 1, 1, 0, 3],[0, 1, 2, 1, 4, 1]])
tensor([[7, 7, 4, 4, 3, 6],[9, 8, 7, 8, 5, 8]])

按规则看,out[i][j] = input[i][index[i][j]] # dim == 1,即,从向量 input[i] 里选取指定位置 index[i][j] 处的数字,放到输出向量 out[i][j] 处。也许多了一个维度就有点绕了,但仔细观察,我们可以假定 i = 0,此时:

out[0][j] = input[0][index[0][j]]  # 对应上图的左侧

若假定 i = 1,则:

out[1][j] = input[1][index[1][j]]  # 对应上图的右侧

即,输出 out[i] 是对输入 imput[i] 执行了一次与一维向量时一样的操作,其中下标是 index[i]。在二维矩阵上的 gather 操作,不过是并行地执行了多个一维向量的 gather

上面是 dim = 1 时的情况,是沿着矩阵的进行 gather,当 dim = 0 时,就是沿着进行 gather

out[i][0] = input[index[i][0]][0]  # dim == 0
out[i][1] = input[index[i][1]][1]
...


也就是并行地执行多个列向量gather,每列 index 是一个并行分支,并行分支的数量可以小于 input 的列数,但不能超过,超过的话,它 gather 哪一列呢?

小结:二维矩阵的 gather 操作就是并行地执行了多个一维向量的 gather 操作;dim=1 按行 gatherdim=0 按列 gather

2.3 高维张量

弄懂一维到二维的 gather,更高维的操作也就清晰了,就是画图有一点难画。假设

x = tensor([[[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9]],[[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]],[[20, 21, 22, 13, 24],[25, 26, 27, 28, 29]]])

则当 dim == 0 时,是沿着第一维进行 gather 的,那么 index.shape[0] (一个并行分支 gather 的元素的数量) 可为任意数,这里设置为 4,其他 index.shape[i≠0] <= input.shape[i≠0]

index = tensor([[[1, 2, 2],[2, 2, 0]],[[0, 0, 1],[1, 0, 1]],[[2, 0, 0],[0, 1, 2]],[[1, 1, 0],[0, 0, 0]]])

index.shape == (4, 2, 3),执行:

y = torch.gather(x, dim=0, index=index)

的示意图如下:

只画了看得见的前两列(两个并行 gather 分支)。红色和绿色箭头表示两列下标沿着 dim=0 进行 gather 操作,每一列和一维向量的 gather 是一样的,只不过这里有 2*3 个列。

再往高维拓展,也是一样,都是从基本的一维向量 gather 拓到并行 gather

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

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

相关文章

elastic:nested实现对满足条件的数组元素聚合查询

0. 引言 某些业务场景下&#xff0c;我们要对数组元素进行聚合查询&#xff0c;就需要用到nested数据类型&#xff0c;但部分场景是针对数组中指定的元素进行聚合&#xff0c;于是就需要对数组元素进行限定&#xff0c;今天来看看这种场景如何实现。 1. 数据准备 首先我们准…

【ECMAScript笔记一】初识JavaScript、变量的使用、数据类型包括哪些?

文章目录 1 初识JavaScript1.1 JS是什么1.2 JS的作用1.3 浏览器怎么执行JS1.4 编译性语言和解释型语言1.5 JS的组成1.6 JS的三种书写位置1.7 JS的注释1.8 JS的输入输出语句 2 变量2.1 变量的使用2.2 使用变量的注意点2.3 变量命名规范 3 数据类型3.1 简单数据类型3.1.1 数字型 …

6.s081操作系统Lab4: trap

文章目录 chapter 4概览4.1 CPU trap流程使用寄存器如果cpu想处理1个trap 4.2 用户态引发的trap4.2.1 uservec4.2.2 usertrap4.2.3 usertrapret和userretusertrapretuserret Lab4Backtrace (moderate)Alarm (hard) chapter 4 概览 trap的场景&#xff1a;系统调用&#xff0c…

2024年手把手教CleanMyMac X v4.14.6破解版安装激活图文教程

小编给您带来CleanMyMac X v4.14.6中文破解版&#xff0c;CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具&#xff0c;使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 CleanMyMac…

redis各种数据类型的应用场景

String应用场景 单值缓存 SET key value GET key 对象缓存 SET user:1 value(json格式数据)MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁 SETNX product:10001 true //返回1代表获取锁成功 …

使用案例总结Vlookup函数的30种用法

1 基础用法 =VLOOKUP(A12,B$1:D$8,3,0) 2 批量查找 =VLOOKUP(A11:A13,A2:C8,3,0) 3 模糊查找 =VLOOKUP("*"&D2&"*",A:B,2,0) 4 模糊查找2 =VLOOKUP(D10&"??",A:B,2,0) 5 模糊查找3 =

pycharm通过ssh连接远程服务器的docker容器进行运行和调试代码

pycharm连接远程服务器的docker容器通常有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 第一种方法比较通用简单&#xff0c;作者比较推崇。 条件…

特氟龙材质PFA、FEP、PTFE三种氟塑料试剂瓶区别

PFA、FEP、PTFE三种材质&#xff0c;都具有良好的耐化学性和耐热性。适合用于微量分析&#xff0c;痕量分析&#xff0c;超痕量分析ICP-MS/OES/AAS分析等实验。PFA、FEP、PTFE是三种常见的氟塑料材料&#xff0c;它们在石油化工、机械、半导体电子等领域得到广泛应用。虽然它们…

展示一段比较简单的人工智能自动做模型的程序

人工智能是一种模拟或模仿人类智能的技术。它通过使计算机系统具有一定的认知能力和学习能力&#xff0c;使其能够自动完成一系列复杂的任务。人工智能可以在各个领域应用&#xff0c;包括图像识别、语音识别、自然语言处理、机器学习等。人工智能还可以用于解决各种问题&#…

Docker 的基本概念、优势、及在程序开发中的应用

Docker 是一种容器化平台,它通过使用容器化技术,将应用程序及其依赖性打包到一个独立的、可移植的容器中,从而实现应用程序的快速部署、可靠性和可扩展性。 下面是 Docker 的一些基本概念和优势: 容器:Docker 使用容器化技术,将应用程序及其依赖性打包到一个可移植的容器…

CUDA C:线程、线程块与线程格

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 第一百篇博客&#xff0c;写点不一样的。 当核函数在主机端被调用时&#xff0c;它会被转移到设备端执行&#xff0c;此时设备会根据核函数的调用格式产生对应的线程(…

docker在线安装minio

1、下载最新minio docker pull minio/minio 2、在宿主机创建 /usr/local/data/miniodocker/config 和 /usr/local/data/miniodocker/data,执行docker命令 docker run -p 9000:9000 -p 9090:9090 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_K…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则&#xff0c;把一个队列中的数据导入另一个队列中&#xff0c;数据的顺序并没有变&#xff0c;并没有变成先进后…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

基于知识库的接口自动化测试——结果模型化方法与装置的分析

一、背景 随着自动化测试的设计理念不断完善、新的技术不断应用&#xff0c;自动化测试资产的积累代价和维护成本不断降低&#xff0c;自动化测试资产的数量持续增长。同时&#xff0c;随着DevOps的普及&#xff0c;应用研发过程越来越敏捷&#xff0c;自动化测试能力逐步从测…

js输入框部分内容不可编辑,其余正常输入,el-input和el-select输入框和多个下拉框联动后的内容不可修改

<tr>//格式// required自定义指令<e-td :required"!read" label><span>地区&#xff1a;</span></e-td><td>//v-if"!read && this.data.nationCode 148"显示逻辑<divclass"table-cell-flex"sty…

camera曝光时间

曝光和传感器读数 相机上的图像采集过程由两个不同的部分组成。第一部分是曝光。曝光完成后&#xff0c;第二步就是从传感器的寄存器中读取数据并传输&#xff08;readout&#xff09;。 曝光&#xff1a;曝光是图像传感器进行感光的一个过程&#xff0c;相机曝光时间&#xf…

技术阅读周刊第十期

技术阅读周刊&#xff0c;每周更新。 周四加了个班&#xff0c;周五没缓过来&#xff0c;就推迟到今天更新了 历史更新 20231117&#xff1a;第六期20231124&#xff1a;第七期20231201&#xff1a;第八期20231215&#xff1a;第九期 Golang: 14 Shorthand Tricks You Might No…

LLMs 玩狼人杀:清华大学验证大模型参与复杂交流博弈游戏的能力

作者&#xff1a;彬彬 编辑&#xff1a;李宝珠&#xff0c;三羊 清华大学研究团队提出了一种用于交流游戏的框架&#xff0c;展示了大语言模型从经验中学习的能力&#xff0c;还发现大语言模型具有非预编程的策略行为&#xff0c;如信任、对抗、伪装和领导力。 近年来&#x…

设计模式——迭代器模式

引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的容器而已。 大部分集合使用…