浅谈tensorflow中张量的提取值和赋值


Posted in Python onJanuary 19, 2020

tf.gather和gather_nd从params中收集数值,tf.scatter_nd 和 tf.scatter_nd_update用updates更新某一张量。严格上说,tf.gather_nd和tf.scatter_nd_update互为逆操作。

已知数值的位置,从张量中提取数值:tf.gather, tf.gather_nd

tf.gather indices每个元素(标量)是params某个axis的索引,tf.gather_nd 中indices最后一个阶对应于索引值。

tf.gather函数

函数原型

gather(
 params,
 indices,
 validate_indices=None,
 name=None,
 axis=0
)

params是要查找的张量,indices是要查找值的索引(int32或int64),axis是查找轴,name是操作名。

如果indices是标量

浅谈tensorflow中张量的提取值和赋值

如果indices是向量

浅谈tensorflow中张量的提取值和赋值

如果indices是高阶张量

浅谈tensorflow中张量的提取值和赋值

返回值:

该函数返回值类型与params相同,具体值是从params中收集过来的,形状为

浅谈tensorflow中张量的提取值和赋值

tf.gather_nd函数

函数原型

gather_nd(
 params,
 indices,
 name=None
)

indices是K阶张量,包含K-1阶的索引值。它最后一阶是索引,最后一阶维度必须小于等于params的秩。indices最后一阶的维数等于params的秩时,我们得到params的某些元素;indices最后一阶的维数小于params的秩时,我们得到params的切片。

浅谈tensorflow中张量的提取值和赋值

输出张量的形状由indices的K-1阶和params索引到的形状拼接而成,如下面

indices.shape[:-1] + params.shape[indices.shape[-1]:]

参数:

params:被收集的张量。

indices:索引张量。必须是以下类型之一:int32,int64。

name:操作的名称(可选)。

返回值:

该函数返回一个张量.与params具有相同的类型。张量值从indices所给定的索引中收集,并且具有这样的形状:

浅谈tensorflow中张量的提取值和赋值

已知赋值的位置,向张量赋值:tf.scatter_nd, tf.scatter_nd_update

tf.scatter_nd对零张量进行赋值,tf.scatter_nd_update对已有可变的张量进行赋值。

tf.scatter_nd函数
scatter_nd(
 indices,
 updates,
 shape,
 name=None
)

创建一个形状为shape的零张量,将updates赋值到indices指定的位置。

indices是整数张量,最内部维度对应于索引。

indices.shape[-1] <= shape.rank

如果indices.shape[-1] = shape.rank,那么indices直接对应到新张量的单个元素。如果indices.shape[-1] < shape.rank,那么indices中每个元素对新张量做切片操作。updates的形状应该如下所示

indices.shape[:-1] + shape[indices.shape[-1]:]

如果我们要把形状为(4,)的updates赋值给形状为(8,)的零张量,如下图所示。

浅谈tensorflow中张量的提取值和赋值

我们需要这样子做

indices = tf.constant([[4], [3], [1], [7]])
updates = tf.constant([9, 10, 11, 12])
shape = tf.constant([8])
scatter = tf.scatter_nd(indices, updates, shape)
with tf.Session() as sess:
 print(sess.run(scatter))

我们得到这样子的张量

[0, 11, 0, 10, 9, 0, 0, 12]

上面代码中,indices的形状是(4,1),updates的形状是(4,),shape的形状是(8,)。

indices.shape[:-1]+shape[indices.shape[-1]:] = (4,)+(,)=(4,)

如果我们要在三阶张量中插入两个切片,如下图所示,则应该像下面代码里所说的那样子做。

浅谈tensorflow中张量的提取值和赋值

indices = tf.constant([[0], [2]])
updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],
   [7, 7, 7, 7], [8, 8, 8, 8]],
   [[5, 5, 5, 5], [6, 6, 6, 6],
   [7, 7, 7, 7], [8, 8, 8, 8]]])
shape = tf.constant([4, 4, 4])
scatter = tf.scatter_nd(indices, updates, shape)
with tf.Session() as sess:
 print(sess.run(scatter))

indices的形状是(2,1),updates的形状是(2,4,4),shape的形状是(4,4,4)。

indices.shape[:-1]+shape[indices.shape[-1]:]=(2,)+(4,4)=(2,4,4)

我们会得到这样子的张量

[[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
 [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]

函数参数

indices:Tensor;必须是以下类型之一:int32,int64;索引值张量。

updates:Tensor;分散到输出的更新。

shape:Tensor;必须与indices具有相同的类型;1-d;得到的张量的形状。

name:操作的名称(可选)。

返回值

此函数返回一个Tensor,它与updates有相同的类型;一个有shape形状的新张量,初始化值为0,部分值根据indices用updates进行更新。

tf.scatter_nd_update函数

函数原型

scatter_nd_update(
 ref,
 indices,
 updates,
 use_locking=True,
 name=None
)

scatter_nd_update也是把updates里面的值根据indices赋值到另外一个张量中,与scatter_nd不同的是,它是赋值到ref。

ref是秩为P的张量,indices是秩为Q的张量。

indices是整数类型的张量,必须具有这样的形状浅谈tensorflow中张量的提取值和赋值

indices最内部的维度对应于ref的某个元素或切片。

updates的形状是浅谈tensorflow中张量的提取值和赋值 ,是秩为Q-1+P-K的张量。

如果我们想要把(4,)的向量赋值到(8,)的ref中,我们可以像下面这样子操作。

ref = tf.Variable([1, 2, 3, 4, 5, 6, 7, 8])
indices = tf.constant([[4], [3], [1] ,[7]])
updates = tf.constant([9, 10, 11, 12])
update = tf.scatter_nd_update(ref, indices, updates)
with tf.Session() as sess:
 print sess.run(update)

我们可以得到这样的ref

[1, 11, 3, 10, 9, 6, 7, 12]

函数参数

ref:一个可变的Tensor。

indices:一个 int32 或 int64 Tensor;一个对ref进行索引的张量.

updates:一个Tensor.必须与ref具有相同的类型;更新值张量.

use_locking:可选的bool;如果为True,则赋值将受锁定的保护;否则行为是不确定的,但可能表现出较少的争用.

name:操作的名称(可选).

返回值:

经过更新的ref。

以上这篇浅谈tensorflow中张量的提取值和赋值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现购物车购物小程序
Apr 18 Python
python正则表达式之对号入座篇
Jul 24 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
python实现拼接图片
Mar 23 Python
Python super()方法原理详解
Mar 31 Python
Python中内建模块collections如何使用
May 27 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Python图片验证码降噪和8邻域降噪
Aug 30 Python
Python中request的基本使用解决乱码问题
Apr 12 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 #Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 #Python
Python openpyxl模块原理及用法解析
Jan 19 #Python
Python imutils 填充图片周边为黑色的实现
Jan 19 #Python
python opencv 实现对图像边缘扩充
Jan 19 #Python
python给图像加上mask,并提取mask区域实例
Jan 19 #Python
python实现在一个画布上画多个子图
Jan 19 #Python
You might like
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
JQuery从头学起第三讲
2010/07/06 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
python set内置函数的具体使用
2019/07/02 Python
应届生求职信写作技巧
2013/10/24 职场文书
拉丁舞学习者的自我评价
2013/10/27 职场文书
保洁主管岗位职责
2013/11/20 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
银行授权委托书样本
2014/10/13 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
SQL注入详解及防范方法
2021/12/06 MySQL