PyTorch笔记之scatter()函数的使用


Posted in Python onFebruary 12, 2020

scatter() 和 scatter_() 的作用是一样的,只不过 scatter() 不会直接修改原来的 Tensor,而 scatter_() 会

PyTorch 中,一般函数加下划线代表直接在原来的 Tensor 上修改

scatter(dim, index, src) 的参数有 3 个

  • dim:沿着哪个维度进行索引
  • index:用来 scatter 的元素索引
  • src:用来 scatter 的源元素,可以是一个标量或一个张量

这个 scatter可以理解成放置元素或者修改元素

简单说就是通过一个张量 src 来修改另一个张量,哪个元素需要修改、用 src 中的哪个元素来修改由 dim 和 index 决定

官方文档给出了 3维张量 的具体操作说明,如下所示

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

exmaple:

x = torch.rand(2, 5)

#tensor([[0.1940, 0.3340, 0.8184, 0.4269, 0.5945],
#    [0.2078, 0.5978, 0.0074, 0.0943, 0.0266]])

torch.zeros(3, 5).scatter_(0, torch.tensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)

#tensor([[0.1940, 0.5978, 0.0074, 0.4269, 0.5945],
#    [0.0000, 0.3340, 0.0000, 0.0943, 0.0000],
#    [0.2078, 0.0000, 0.8184, 0.0000, 0.0266]])

具体地说,我们的 index 是torch.tensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]),一个二维张量,下面用图简单说明

我们是 2维 张量,一开始进行 $self[index[0][0]][0]$,其中 $index[0][0]$ 的值是0,所以执行 $self[0][0] = x[0][0] = 0.1940$

$self[index[i][j]][j] = src[i][j] $

PyTorch笔记之scatter()函数的使用

再比如$self[index[1][0]][0]$,其中 $index[1][0]$ 的值是2,所以执行 $self[2][0] = x[1][0] = 0.2078$

PyTorch笔记之scatter()函数的使用

src 除了可以是张量外,也可以是一个标量

example:

torch.zeros(3, 5).scatter_(0, torch.tensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), 7)

#tensor([[7., 7., 7., 7., 7.],
#    [0., 7., 0., 7., 0.],
#    [7., 0., 7., 0., 7.]]

scatter()一般可以用来对标签进行 one-hot 编码,这就是一个典型的用标量来修改张量的一个例子

example:

class_num = 10
batch_size = 4
label = torch.LongTensor(batch_size, 1).random_() % class_num
#tensor([[6],
#    [0],
#    [3],
#    [2]])
torch.zeros(batch_size, class_num).scatter_(1, label, 1)
#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.]])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
在Python的Tornado框架中实现简单的在线代理的教程
May 02 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
分析Python中解析构建数据知识
Jan 20 Python
python 日志增量抓取实现方法
Apr 28 Python
python写入已存在的excel数据实例
May 03 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
python_mask_array的用法
Feb 18 Python
python 双循环遍历list 变量判断代码
May 04 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
python常见的占位符总结及用法
Jul 02 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 #Python
pycharm无法导入本地模块的解决方式
Feb 12 #Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 #Python
解决pycharm同一目录下无法import其他文件
Feb 12 #Python
适合Python初学者的一些编程技巧
Feb 12 #Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 #Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 #Python
You might like
截获网站title标签之家内容的例子
2006/10/09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
浅谈React高阶组件
2018/03/28 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
python实现bucket排序算法实例分析
2015/05/04 Python
python删除服务器文件代码示例
2018/02/09 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
python em算法的实现
2020/10/03 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
工作表扬信
2015/01/17 职场文书
入党群众意见范文
2015/06/02 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
培训计划通知
2015/07/15 职场文书
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python