pytorch scatter_ 函数介绍

devtools/2024/10/25 4:25:14/

scatter_ 是 PyTorch 中的一个原地操作函数,用于在给定的索引处将某些值填充到张量的指定维度中。它的常见用途之一是将类别标签转换为 one-hot 编码,不过它也适用于其他场景,如在特定索引处更新张量的值。

scatter_ 函数的签名如下:

scatter_(dim, index, src)
  • dim:指定操作的维度。即在这个维度上更新值。
  • index:包含索引的张量,指定要更新值的位置。
  • src:要填入的值。可以是一个标量(单个值),也可以是一个张量。

使用示例

1. 使用 scatter_ 实现 one-hot 编码

我们可以通过 scatter_ 将类别标签转换为 one-hot 编码。

代码示例:

import torch# logits 模拟网络输出 [batch_size, num_classes]
logits = torch.tensor([[2.0, 1.0, 0.1], [1.5, 2.5, 0.5]])  # 形状 [2, 3]# target 是真实的类别标签 [batch_size]
target = torch.tensor([0, 2])  # 形状 [2]# 创建一个与 logits 相同大小的全零张量
target_onehot = torch.zeros_like(logits)  # 形状 [2, 3]# 使用 scatter_ 函数在第 1 维(类别维度)根据 target 的索引设置为 1
target_onehot.scatter_(1, target.view(-1, 1), 1)print("one-hot 编码:")
print(target_onehot)

注:target.view(-1, 1) 中的 1 指的是将 target 张量的形状重新调整为 两维,并且使得第二个维度的大小固定为 1

输出:

tensor([[1., 0., 0.],  # 第一个样本,类别为 0[0., 0., 1.]])  # 第二个样本,类别为 2
2. 使用 scatter_ 更新指定位置的值

你还可以用 scatter_ 在张量的指定位置填充任意值。这里是一个简单的例子,将特定索引的位置设置为自定义的数值:

代码示例:

import torch# 创建一个 3x3 的全零张量
tensor = torch.zeros(3, 3)# 定义索引
index = torch.tensor([[0, 2, 1]])  # 每行对应位置的索引# 要填入的值
src = torch.tensor([[5, 9, 7]])# 使用 scatter_ 在第 1 维(列)填充 src 的值到指定索引位置
tensor.scatter_(1, index, src)print("填充值后的张量:")
print(tensor)

输出:

tensor([[5., 7., 9.],  # 在索引 0 处填 5,索引 1 处填 7,索引 2 处填 9[5., 7., 9.],[5., 7., 9.]])
3. scatter_ 与广播

scatter_ 支持广播机制。你可以使用一个标量值来替换指定的索引位置,也可以使用一个与 index 兼容的张量来填充不同的值。

代码示例:

import torch# 创建一个 4x3 的全零张量
tensor = torch.zeros(4, 3)# 定义索引
index = torch.tensor([[0, 2, 1], [2, 1, 0], [1, 0, 2], [2, 1, 0]])  # 4x3 的索引# 要填入的值
src = torch.tensor([5, 9, 7])  # 广播到每一行# 使用 scatter_ 在第 1 维(列)填充 src 的值到指定索引位置
tensor.scatter_(1, index, src)print("填充值后的张量:")
print(tensor)

输出:

tensor([[5., 7., 9.],[7., 9., 5.],[9., 5., 7.],[7., 9., 5.]])

总结

scatter_ 函数可以根据指定的索引,在目标张量的某个维度上填充源张量或标量的值。它的常见应用包括:

  • one-hot 编码:将类别标签转换为 one-hot 格式。
  • 更新张量特定位置的值:可以根据索引在张量的某些特定位置填入新的值。

它灵活且高效,适合用于需要对张量的特定索引进行操作的场景。


http://www.ppmy.cn/devtools/128588.html

相关文章

Facebook的AI驱动发展:人工智能如何改变社交体验

个性化内容推荐 Facebook利用AI算法分析用户的行为数据,包括点赞、评论、分享和浏览历史。这些数据使得平台能够深入了解用户的兴趣和偏好,从而提供个性化的内容推荐。例如,用户在浏览动态时,AI系统会根据用户的互动历史&#xf…

短视频去水印小程序流量主最新接口带配音功能

短视频去水印小程序最新版包更新接口 支持对接流量主盈利 支持各大短视频平台 如: 抖音、快手、等 可提一键取视频文案、可一键分析主页视频链接地址工具 新增:带配音功能,文案提取功能,独立后台,可以设置卡密,后台…

深入探究安卓 Binder 机制及其应用

在安卓开发的广袤领域中,Binder 机制宛如一座坚固的桥梁,连接着不同进程间的通信。理解 Binder 机制对于安卓开发者而言,是掌握系统底层原理、优化应用性能的关键。 首先,让我们深入剖析 Binder 机制的核心原理。Binder 本质上是…

安全见闻(2)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻二:Web程序构成与潜在漏洞声明导语前端语言及潜在漏洞前端语言前端框架与代码库代码库的概念和用途流行的JavaScript框架常见的代码库 前端潜在漏洞 后端语言及潜在漏洞常见后端语言协议问题后端潜在漏洞 数据库及潜在漏洞数据库分类数据…

在MySQL中使用B+ 树索引如何查找连带表数据

在 MySQL 中,索引通过一定的数据结构(如 B 树)来加速查找表中的数据。下面给出一个关于 B 树索引查找连带表数据的伪代码示例。 伪代码结构: 建立索引:创建索引并初始化 B 树。查找索引:根据查询条件从 B…

主键 外键

主键 外键 在关系型数据库中,主键(Primary Key)和外键(Foreign Key)是用于维护数据完整性和建立表之间关系的重要概念。 主键(Primary Key) 定义: 主键是一个或多个列的组合,其值能…

界面耻辱纪念堂--可视元素04

当我们第一次注意到 Visual Basic 5.0 菜单的动画效果“特性”时,我们只能嘲笑这种特性的傻气。事实上,我们并不觉得特性本身傻气,而是微软为这个特性投资,然后将这个特性应用到他们所有的主流产品(例如,Of…

ESP32移植Openharmony外设篇(3)OLED屏

模块简介 产品介绍 OLED (Organic Light-Emitting Diode):有机发光二极管又称为有机电激光显示,OLED显示技术具有自发光的特性,采用薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且…