当前位置: 首页 > news >正文

推荐收藏!分享 PyTorch 中一些高级的索引和选择操作技巧

关于 Pytorch ,我之前分享过很多篇,喜欢的可以收藏、关注、点赞。

  • 这一次,我准备了 20节 PyTorch 中文课程
  • 小白学 PyTorch 系列:54个超强 pytorch 操作
  • 9个技巧让你的 PyTorch 模型训练飞快!
  • Keras 3.0发布:全面拥抱 PyTorch
  • PyTorch 进阶指南,10个必须知道的原则

至于为什么今年这么重视 Pytorch ,熟悉大模型、算法的小伙伴都应该知道。大部分的大模型开发语言都是Pytorch。废话不多说。转入正题。


在某些情况下,你可能需要使用 PyTorch 进行一些高级的索引和选择操作,例如回答这样的问题:“如何根据张量B中指定的索引来从张量A中选择元素?”

在本文中,我们将介绍三种最常见的用于此类任务的方法,即torch.index_select、torch.gather和torch.take。我们将详细解释它们,并对它们进行对比。

技术交流

技术要学会交流、分享,不建议闭门造车。独学而无有友,则孤陋而寡闻

好的文章离不开朋友的分享、推荐,记得点赞支持一下。资料干货、技术答疑、数据&源码,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:交流
方式②、添加微信号:dkl88194,备注:交流

torch.index_select

torch.index_select沿着一个维度选择元素,同时保持其他维度不变。也就是说:保留所有其他维度的所有元素,但是按照索引张量从目标维度中选择元素。让我们用一个2D示例来演示,在该示例中我们沿着维度1进行选择:

num_picks = 2values = torch.rand((len_dim_0, len_dim_1))
indices = torch.randint(0, len_dim_1, size=(num_picks,))
# [len_dim_0, num_picks]
picked = torch.index_select(values, 1, indices)

结果张量的形状为[len_dim_0, num_picks]:沿着维度0的每个元素,我们从维度1中选择了相同的元素。让我们将其可视化:

现在我们转向三维空间。为此,我们更贴近机器学习/数据科学的世界,想象一个形状为[batch_size, num_elements, num_features]的张量:因此,我们有num_elements个元素,每个元素具有num_feature个特征,并且所有内容都被批处理了。使用torch.index_select,我们可以为每个批次/特征组合选择相同的元素:

import torchbatch_size = 16
num_elements = 64
num_features = 1024
num_picks = 2values = torch.rand((batch_size, num_elements, num_features))
indices = torch.randint(0, num_elements, size=(num_picks,))
# [batch_size, num_picks, num_features]
picked = torch.index_select(values, 1, indices)

有些人可能希望以代码形式了解index_select的作用 — 因此,这是一个使用简单的for循环重新实现此函数的方法:

picked_manual = torch.zeros_like(picked)
for i in range(batch_size):for j in range(num_picks):for k in range(num_features):picked_manual[i, j, k] = values[i, indices[j], k]assert torch.all(torch.eq(picked, picked_manual))

torch.gather

接下来,我们转向torch.gather。gather的行为与index_select类似,但现在所需维度中的元素选择取决于其他维度 — 即,重新使用我们的ML示例:对于每个批次索引和每个特征,我们可以从“元素”维度中选择不同的元素 — 我们根据另一个张量的索引选择元素。

当我在进行ML项目时,我经常遇到这种用例,一个具体的例子是基于某些条件从树中选择节点,并且每个节点由一些特征指定:然后我们生成一个索引选择矩阵,将要选择的元素放在批次维度中,并沿着特征维度重复这些值。即:对于每个批次索引,我们可以根据某些条件选择不同的元素 — 在我们的示例中,这个条件仅取决于批次索引 — 尽管它也可能取决于特征索引。

但首先,让我们再次从一个2D示例开始:

num_picks = 2values = torch.rand((len_dim_0, len_dim_1))
indices = torch.randint(0, len_dim_1, size=(len_dim_0, num_picks))
# [len_dim_0, num_picks]
picked = torch.gather(values, 1, indices)

当可视化时,我们会观察到,选择现在不再由直线特征化,而是对于维度0中的每个索引,在维度1中选择不同的元素:


好的,现在让我们转向三维,并展示重新实现这个选择的Python代码:

import torchbatch_size = 16
num_elements = 64
num_features = 1024
num_picks = 5
values = torch.rand((batch_size, num_elements, num_features))
indices = torch.randint(0, num_elements, size=(batch_size, num_picks, num_features))
picked = torch.gather(values, 1, indices)picked_manual = torch.zeros_like(picked)
for i in range(batch_size):for j in range(num_picks):for k in range(num_features):picked_manual[i, j, k] = values[i, indices[i, j, k], k]assert torch.all(torch.eq(picked, picked_manual))

torch.take

torch.take可能是介绍的这三个函数中最容易理解的:它基本上将输入张量视为被展平的,然后从这个列表中选择元素。例如:当将take应用于形状为[4, 5]的输入张量,并选择索引6和19时,我们将获得展平张量的第6个和第19个元素 — 也就是说,来自第2行的第2个元素和最后一个元素。

2D示例:

num_picks = 2values = torch.rand((len_dim_0, len_dim_1))
indices = torch.randint(0, len_dim_0 * len_dim_1, size=(num_picks,))
# [num_picks]
picked = torch.take(values, indices)

正如我们所见,现在我们只得到了两个元素。


以下是带有随后重新实现的3D选择。请注意,索引张量现在可以具有任意形状,并且结果选择也是按照此形状给出的:

import torchbatch_size = 16
num_elements = 64
num_features = 1024
num_picks = (2, 5, 3)values = torch.rand((batch_size, num_elements, num_features))
indices = torch.randint(0, batch_size * num_elements * num_features, size=num_picks)
# [2, 5, 3]
picked = torch.take(values, indices)picked_manual = torch.zeros(num_picks)
for i in range(num_picks[0]):for j in range(num_picks[1]):for k in range(num_picks[2]):picked_manual[i, j, k] = values.flatten()[indices[i, j, k]]assert torch.all(torch.eq(picked, picked_manual))

结论

在本文中,我们看到了PyTorch中三种常见的选择方法:torch.index_select、torch.gather和torch.take。通过所有这些方法,可以根据某些条件从张量中选择/索引元素。

对于所有方法,我们都从一个简单的2D示例开始,并通过图形化方式可视化了结果选择。然后,我们转向了一个略微更复杂和更真实的3D场景,在这个场景中,我们从形状为[batch_size,num_elements,num_features]的张量中进行选择 —— 这可能是任何ML项目中的常见用例。

相关文章:

推荐收藏!分享 PyTorch 中一些高级的索引和选择操作技巧

关于 Pytorch ,我之前分享过很多篇,喜欢的可以收藏、关注、点赞。 这一次,我准备了 20节 PyTorch 中文课程小白学 PyTorch 系列:54个超强 pytorch 操作9个技巧让你的 PyTorch 模型训练飞快!Keras 3.0发布:…...

Apache Calcite 快速入门指南

Apache Calcite 快速入门指南 参考地址:Apache Calcite 快速入门指南 - 知乎 Apache Calcite 是一个动态数据管理框架,提供了:SQL 解析、SQL 校验、SQL 查询优化、SQL 生成以及数据连接查询等典型数据库管理功能。Calcite 的目标是 One Size …...

基于MUSIC算法的六阵元圆阵DOA估计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序 ........................................…...

Mysql索引学习

mysql索引-自学版 1 索引语法2 索引类别3 索引原理磁盘IO与预读索引数据结构 B树B树的前生今世B 树代码(进阶) 4 索引使用策略及优化优化索引的几种方法 索引常见面试题面经实战 1 索引语法 索引的语法:创建、修改、增加、删除等操作&#x…...

【MySQL】:高效利用MySQL函数实用指南

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. MySQL函数概论二. 字符串函数三. 数值函数四. 日期函数五. 流程函数&#x1…...

vue3+electron开发桌面应用,静态资源处理方式及路径问题总结

目录 1、静态资源放到src/assets/目录下 2、静态路径和动态路径的写法 3、编译时vite.config.js的配置...

2024全国水科技大会暨高氨氮废水厌氧氨氧化处理技术论坛(四)

一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战,加快生态环境科技创新,构建绿色技术创新体系,全面落实科学技术部、生态环境部等部委编制的《“十四五”生态环境领域科技创新专项规划》,积极落实省校合作&…...

基于springboot+vue的美食推荐商城

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.02.05-2024.02.10

论文目录~ 1.ViGoR: Improving Visual Grounding of Large Vision Language Models with Fine-Grained Reward Modeling2.CLIP-Loc: Multi-modal Landmark Association for Global Localization in Object-based Maps3.Exploring Visual Culture Awareness in GPT-4V: A Compre…...

华为笔记本自带windows11如何改为win10

目录 一、前言 二、遇到问题 三、问题解决 一、前言 新购买的华为笔记本电脑自带windows11系统,虽然是正版系统,但还是希望能重新装Windows10版本。一是我已经习惯此系统,二是该系统上运行的开发工具比较稳定。 二、遇到问题 说干就干&…...

Axios 面试题

Axios 面试题 问题描述: 什么是 Axios?它的主要特点是什么? 答案: Axios 是一个基于 Promise 的 HTTP 客户端库,用于在浏览器和 Node.js 中发送 HTTP 请求。它具有以下主要特点: 支持浏览器和 Node.js 环境…...

速盾:cdn服务器怎么做

CDN(Content Delivery Network)即内容分发网络,是一种通过将内容(如网页、图片、视频等)缓存到离用户较近的服务器上,以提升用户访问速度和减轻源服务器负载的解决方案。在CDN中,CDN服务器是承担…...

基础小白快速入门c语言--

变量: 表面理解:在程序运行期间,可以改变数值的数据, 深层次含义:变量实质上代表了一块儿内存区域,我们可以将变量理解为一块儿内存区域的标识,当我们操作变量时,相当于操作了变量…...

CI/CD:安装配置Gitlab Runner

CI/CD笔记 安装配置Gitlab Runner - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136296840 Address of this art…...

【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema

【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema 一、生成Schema二、加密字段三、JSON Schema类型 从3.6版本开始,MongoDB支持根据提供的 JSON Schema验证documents的集合。在创建集合时,可以定义schema本身以及验证操作和级别&…...

用于游戏开发的顶级 PYTHON 框架

一、说明 我们试图用python开发游戏,一旦产生这个念头,就伴随这样一个问题:当今用于构建游戏的领先 Python 框架有哪些?python下,支持游戏开发平台有哪些优势?我们在这篇博文中告诉你。 二、高级游戏平台简…...

【MongoDB】docker安装mongodb 7.0

下载镜像 docker pull mongo创建本地数据存储文件夹 rootxrx:~/etc# tree mongodb/ mongodb/ └── data使用docker创建容器,并挂载配置文件,并设置密码 docker run -p 5233:27017 -v /root/etc/mongodb/data:/data/db --name mongo -e MONGO_INITDB_ROOT_USERNAMEroot -…...

win10安全中心误删文件怎么办?解析恢复与预防策略

在使用Windows 10的过程中,许多用户依赖于其内置的安全中心来保护电脑免受恶意软件的侵害。然而,有时安全中心的误判可能导致重要文件被错误地删除。当面对这种情况时,了解如何恢复误删的文件并掌握预防措施显得尤为重要。本文将为您详细解析…...

如何锁定MYSQL内存在物理内存里?

MYSQL 8.0 这个参数是 OFF 这个参数是啥意思呢? 按英文单词理解是 锁定在内存意思.突然想起来是因为 周报巡检时主库有使用SWAP内存 而从库却使用更多 使用脚本查看SWAP 进程排序 for i in cd /proc;ls |grep "^[0-9]"|awk $0 >100 ;do awk /Swap:/{aa$2} EN…...

vue菜单栏跳转方案

vue菜单栏跳转方案 <template><div><el-container style"height: 100vh"><el-aside width"200px" style"background-color: #b3c0d1"><el-menuopen"handleOpen"close"handleClose"select"h…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...