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

飞桨paddle API函数scatter详解

飞桨的scatter函数,是通过基于 updates 来更新选定索引 index 上的输入来获得输出,具体官网api文档见:

scatter-API文档-PaddlePaddle深度学习平台

官网给的例子如下:

 >>> import paddle>>> x = paddle.to_tensor([[1, 1], [2, 2], [3, 3]], dtype='float32')>>> index = paddle.to_tensor([2, 1, 0, 1], dtype='int64')>>> updates = paddle.to_tensor([[1, 1], [2, 2], [3, 3], [4, 4]], dtype='float32')>>> output1 = paddle.scatter(x, index, updates, overwrite=False)>>> print(output1)Tensor(shape=[3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,[[3., 3.],[6., 6.],[1., 1.]])>>> output2 = paddle.scatter(x, index, updates, overwrite=True)>>> # CPU device:>>> # [[3., 3.],>>> #  [4., 4.],>>> #  [1., 1.]]>>> # GPU device maybe have two results because of the repeated numbers in index>>> # result 1:>>> # [[3., 3.],>>> #  [4., 4.],>>> #  [1., 1.]]>>> # result 2:>>> # [[3., 3.],>>> #  [2., 2.],>>> #  [1., 1.]]

但是如果是初学者,看官网的例子可能还是无法明白scatter的运算方式,下面就结合一个更加明白的例子来说明:

import paddle
x = paddle.to_tensor([[100, 200], [300, 400], [500, 600]], dtype='float32')
index = paddle.to_tensor([2, 1, 0, 1], dtype='int64')
updates = paddle.to_tensor([[10, 11], [21, 22], [33, 34], [40, 41]], dtype='float32')output1 = paddle.scatter(x, index, updates, overwrite=False)
print(output1)
output2 = paddle.scatter(x, index, updates, overwrite=True)
print(output2)

输出结果:

Tensor(shape=[3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,[[33., 34.],[61., 63.],[10., 11.]])
Tensor(shape=[3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,[[33., 34.],[40., 41.],[10., 11.]])

scatter详解

输入是三个值:源值x ,索引index, 变量updates,分析函数输出,可以得出以下结论:

1 scatter函数的输出shape是和x一致的

2 函数输出的值跟x没关系

3 函数输出值跟变量updates值有关

4 输出值跟updates的有关,具体取值的索引跟index有关

具体来说,就是不需要x的值,只使用了它的维度信息,然后根据索引,将变量updates的值填入x的维度中。比如index值是[2, 1, 0, 1],第一位是2,那么就把updates的第一组数[10, 11](也就是updates[0])取出来放到x[2]里;index第二位是1 ,就把的updates的第2组数[21, 22](也就是updates[1])取出来放到x[1]里。以此类推,index第三位是0, 那么就把updates的第3组数[33, 34](也就是updates[2])放到x[0]里。

到了index第四位数,它是1 ,那么就需要把updates的第四组数[40, 41](也就是updates[3]),放入到x[1]中 。这时候有个问题,就是前面x[1]中已经放入了[21,22]。这时候就看函数的overwrite参数的设置了,如果设置overwrite=True ,那么直接用现在的值[40, 41]取代以前的值,最终函数返回结果就是[[33, 34], [40, 41], [10, 11]] 。如果函数设为overwrite=False ,那么就将值[40, 41]与以前的x[1](21, 22)相加,结果是[61, 63],最终返回值就是[[33, 34], [61, 63], [10, 11]]

好了,这样大家就明白scatter的运算机制了吧? 

小贴士

飞桨官网给出了scatter函数的python代码实现,其中因为用了巧妙的思路来提高速度,可读性略有下降:

 >>> import paddle>>> #input:>>> x = paddle.to_tensor([[1, 1], [2, 2], [3, 3]], dtype='float32')>>> index = paddle.to_tensor([2, 1, 0, 1], dtype='int64')>>> # shape of updates should be the same as x>>> # shape of updates with dim > 1 should be the same as input>>> updates = paddle.to_tensor([[1, 1], [2, 2], [3, 3], [4, 4]], dtype='float32')>>> overwrite = False>>> # calculation:>>> if not overwrite:...     for i in range(len(index)):...         x[index[i]] = paddle.zeros([2])>>> for i in range(len(index)):...     if (overwrite):...         x[index[i]] = updates[i]...     else:...         x[index[i]] += updates[i]>>> # output:>>> out = paddle.to_tensor([[3, 3], [6, 6], [1, 1]])>>> print(out.shape)[3, 2]

scatter的运算机制不管overwrite是否为True,x的值都不参与运算,理论上应该都清除,也就是在循环里置0 :x[index[i]] = paddle.zeros([2])

实际上如果overwrite是True,那么在赋值的时候本身可以直接写入 x[index[i]] = updates[i],这样就可以省略x[index[i]] = paddle.zeros([2])这句,这就是为什么这段置0代码放到了条件:if not overwrite: 这句里面的原因。

相关文章:

飞桨paddle API函数scatter详解

飞桨的scatter函数,是通过基于 updates 来更新选定索引 index 上的输入来获得输出,具体官网api文档见: scatter-API文档-PaddlePaddle深度学习平台 官网给的例子如下: >>> import paddle>>> x paddle.to_tens…...

RCE漏洞复现

PHP命令执行常用函数 回调函数必须是命令执行和代码执行的函数,有两个条件 必须是函数,而且需要有函数运行的参数 危害:可以直接删除文件,添加文件,甚至可以添加用户 system --执行外部程序,并且显示输…...

Qt QTabWidget之创建标签页的多页面切换

QTabWidget 用来分页显示 重要函数: 1.void setTabText(int, QString); //设置页面的名字. 2.void setTabToolTip(QString); //设置页面的提示信息. 3.void setTabEnabled(bool); //设置页面是否被激活. 4.void setTabPosition(QTabPosition::South); //设置页面名字的位置. 5.…...

【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出

【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出 文章目录 【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出1.简介2.验证用例3.软件代码4.链接脚本5.编译脚本6.仿真结果6.1 复位结束6.2 运行成功6.3 终端打印 7.总结 1.简介 本文将详细阐述如何利用 printf 来打印字符串…...

时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention

时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 文章目录 前言时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 一、VMD-TCN-BiLSTM-Attention模型1. **…...

Python知识点:如何使用Godot与Python进行游戏脚本编写

在Godot中使用Python进行游戏脚本编写,你需要通过一个插件来实现,因为Godot原生支持的脚本语言是GDScript、VisualScript和C#。这个插件被称为Godot-Python,它允许你在Godot引擎中使用Python编写脚本。以下是详细的步骤指导你如何配置和使用G…...

Spring MVC数据绑定和响应学习笔记

学习视频:12001 数据绑定_哔哩哔哩_bilibili 目录 1.数据绑定 简单数据绑定 默认类型数据绑定 简单数据类型绑定的概念 参数别名的设置 PathVariable注解的两个常用属性 POJO绑定 自定义类型转换器 xml方式 注解方式 数组绑定 集合绑定 复杂POJO绑定 属性为对象类…...

Vulnhub JIS-CTF靶机详解

项目地址 https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/ 修改靶机的网卡 开机时长按shift,进入此页面 选择root模式进入 将只读模式改为读写模式 mount -o remount,rw / 查看本机的网卡名称 …...

FPGA资源评估

FPGA资源评估 文章目录 FPGA资源评估前言一、资源评估1.1 资源有哪些1.2 资源统计 二、 FPGA 的基本结构三、 更为复杂的 FPGA 架构 前言 一、资源评估 大家在项目中一般会要遇到需要资源评估的情况,例如立了新项目,前期需要确定使用什么FPGA片子&…...

REST framework中Views API学习

REST framework提供了一个APIView类,它是Django的View类的子类。 APIView类和一般的View类有以下不同: 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。处理方法可以返回REST framework的…...

Vue(四)——总结

渐进式JavaScript框架 Vue.js是一套构建用户界面(UI)的渐进式JavaScript框架。 1、库和框架的区别? 库:库是提供给开发者的一个封装好的特定于某一方面的集合(方法和函数),库没有控制权&…...

计算机毕业设计 招生宣传管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

练习题PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

突破长度限制 使用usort上传后门 usort — 使用用户自定义的比较函数对数组中的值进行排序 paramusort(...$GET); ...为php设置可变长参数 在url地址栏中输入[]test&1[]phpinfo();&2assert 包含了phpiinfo()命令执行 结合usort使用 assert…...

EPLAN关于PLC的输入输出模块绘制

EPLAN关于PLC的输入输出模块绘制 总览图上的PLC绘制原理图上的PLC绘制编辑IO注释显示总览界面IO注释自动关联总览IO地址 总览图上的PLC绘制 右键项目【新建】 页类型选择【总览】,描述可以自由编辑,之后确认即可。 由于我们需要绘制PLC的输入输出&#x…...

【Linux】sersync 实时同步

原理 rsync 是不支持实时同步的,通常我们借助于 inotify 这个软件来实时监控文件变化,一旦inotify 监控到文件变化,则立即调用 rsync 进行同步,推送到 rsync 服务端。 环境准备 步骤1:获取数据包 获取 sersync 的包…...

Unity 资源分享 之 恐龙Ceratosaurus资源模型携 82 个动画来袭

Unity 资源分享 之 恐龙Ceratosaurus资源模型携 82 个动画来袭 一、前言二,资源包内容三、免费获取资源包 一、前言 亲爱的 Unity 开发者和爱好者们,大家好!今天要为大家分享一份超级酷炫的 Unity 资源——恐龙资源模型,而且它还…...

【AI绘画】 学习内容简介

AI绘画-学习内容简介 1. 效果展示 本次测试主要结果展示如下: 卡通手办定制1 卡通手办定制2 艺术写真定制 2. 主要目录 AI 绘画- 文生图,图生图及lora使用(基于diffusers) AI 绘画- 模型转换与快速生图(基于diffus…...

树形结构查找(B树、B+树)

平衡树结构的树高为 O(logn) ,平衡树结构包括两种平衡二叉树结构(分别为 AVL 树和 RBT)以及一种树结构(B-Tree,又称 B 树,它的度大于 2 )。AVL 树和 RBT 适合内部存储的应用,而 B 树…...

网络通信(TCP/UDP协议 三次握手四次挥手 )

三、TCP协议与UDP协议 1、TCP/IP、TCP、 UDP是什么 TCP/IP协议是一个协议簇,里面包括很多协议的, UDP只是其中的一个, 之所以命名为TCP/IP协议, 因为TCP、 IP协议是两个很重要的协议,就用他两命名了,而TCP…...

C# ADO.Net 通用按月建表插入数据

原理是获取原表表结构以及索引动态拼接建表SQL&#xff0c;如果月表存在则不创建&#xff0c;不存在则创建表结构 代码如下 /// <summary>/// 根据指定的表名和时间按月进行建表插入&#xff08;如果不存在对应的月表&#xff09;/// </summary>/// <param nam…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...