1 概述

前文两篇文章分别讲解了TensorFlow核心对象Graph,和Graph的节点Operation。Graph另外一大成员,即为其边Tensor。边用来表示计算的数据,它经过上游节点计算后得到,然后传递给下游节点进行运算。本文讲解Graph的边Tensor,以及TensorFlow中的变量。

2 前端边Tensor数据结构

Tensor作为Graph的边,使得节点Operation之间建立了连接。上游源节点Operation经过计算得到数据Tensor,然后传递给下游目标节点,是一个典型的生产者-消费者关系。下面来看Tensor的数据结构

@tf_export("Tensor")
class Tensor(_TensorLike):def __init__(self, op, value_index, dtype):# 源节点,tensor的生产者,会计算得到tensorself._op = op
​# tensor在源节点的输出边集合中的索引。源节点可能会有多条输出边# 利用op和value_index即可唯一确定tensor。self._value_index = value_index
​# tensor中保存的数据的数据类型self._dtype = dtypes.as_dtype(dtype)
​# tensor的shape,可以得到张量的rank,维度等信息self._shape_val = tensor_shape.unknown_shape()
​# 目标节点列表,tensor的消费者,会使用该tensor来进行计算self._consumers = []
​#self._handle_data = Noneself._id = uid()
​

Tensor中主要包含两类信息,一个是Graph结构信息,如边的源节点和目标节点。另一个则是它所保存的数据信息,例如数据类型,shape等。

3 后端边Edge数据结构

后端中的Graph主要成员也是节点node和边edge。节点node为计算算子Operation,边Edge为算子所需要的数据,或者代表节点间的依赖关系。这一点和Python中的定义相似。边Edge的持有它的源节点和目标节点的指针,从而将两个节点连接起来。下面看Edge类的定义。

class Edge {private:Edge() {}
​friend class EdgeSetTest;friend class Graph;// 源节点, 边的数据就来源于源节点的计算。源节点是边的生产者Node* src_;
​// 目标节点,边的数据提供给目标节点进行计算。目标节点是边的消费者Node* dst_;
​// 边id,也就是边的标识符int id_;
​// 表示当前边为源节点的第src_output_条边。源节点可能会有多条输出边int src_output_;
​// 表示当前边为目标节点的第dst_input_条边。目标节点可能会有多条输入边。int dst_input_;
};
​

Edge既可以承载tensor数据,提供给节点Operation进行运算,也可以用来表示节点之间有依赖关系。对于表示节点依赖的边,其src_output_, dst_input_均为-1,此时边不承载任何数据。

4 常量constant

TensorFlow的常量constant,最终包装成了一个Tensor。通过tf.constant(10),返回一个Tensor对象。

@tf_export("constant")
def constant(value, dtype=None, shape=None, name="Const", verify_shape=False):# 算子注册到默认Graph中g = ops.get_default_graph()# 对常量值value的处理tensor_value = attr_value_pb2.AttrValue()tensor_value.tensor.CopyFrom(tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
​# 对常量值的类型dtype进行处理dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype)
​# 构造并注册类型为“Const”的算子到Graph中,从算子的outputs中取出输出的tensor。const_tensor = g.create_op("Const", [], [dtype_value.type],attrs={"value": tensor_value,"dtype": dtype_value},name=name).outputs[0]return const_tensor
​

tf.constant的过程为

  1. 获取默认graph
  2. 对常量值value和常量值的类型dtype进行处理
  3. 构造并注册类型为“Const”的算子到默认graph中,从算子的outputs中取出输出的tensor。

此时只是图的构造过程,tensor并未承载数据,仅表示Operation输出的一个符号句柄。经过tensor.eval()或session.run()后,才会启动graph的执行,并得到数据。

5 变量Variable

Variable构造器

通过tf.Variable()构造一个变量,代码如下,我们仅分析入参。

@tf_export("Variable")
class Variable(object):def __init__(self,initial_value=None,trainable=True,collections=None,validate_shape=True,caching_device=None,name=None,variable_def=None,dtype=None,expected_shape=None,import_scope=None,constraint=None):
# initial_value: 初始值,为一个tensor,或者可以被包装为tensor的值
# trainable:是否可以训练,如果为false,则训练时不会改变
# collections:变量要加入哪个集合中,有全局变量集合、本地变量集合、可训练变量集合等。默认加入全局变量集合中
# dtype:变量的类型
​

主要的入参代码中已经给出了注释。Variable可以接受一个tensor或者可以被包装为tensor的值,来作为初始值。事实上,Variable可以看做是Tensor的包装器,它重载了Tensor的几乎所有操作,是对Tensor的进一步封装。

Variable初始化

变量只有初始化后才能使用,初始化时将initial_value初始值赋予Variable内部持有的Tensor。通过运行变量的初始化器可以对变量进行初始化,也可以执行全局初始化器。如下

y = tf.Variable([5.3])
​
with tf.Session() as sess:initialization = tf.global_variables_initializer()print sess.run(y)
​

Variable集合

Variable被划分到不同的集合中,方便后续操作。常见的集合有

  1. 全局变量:全局变量可以在不同进程中共享,可运用在分布式环境中。变量默认会加入到全局变量集合中。通过tf.global_variables()可以查询全局变量集合。其op标示为GraphKeys.GLOBAL_VARIABLES
@tf_export("global_variables")
def global_variables(scope=None):return ops.get_collection(ops.GraphKeys.GLOBAL_VARIABLES, scope)

  1. 本地变量:运行在进程内的变量,不能跨进程共享。通常用来保存临时变量,如训练迭代次数epoches。通过tf.local_variables()可以查询本地变量集合。其op标示为GraphKeys.LOCAL_VARIABLES
@tf_export("local_variables")
def local_variables(scope=None):return ops.get_collection(ops.GraphKeys.LOCAL_VARIABLES, scope)

  1. 可训练变量:一般模型参数会放到可训练变量集合中,训练时,做这些变量会得到改变。不在这个集合中的变量则不会得到改变。默认会放到此集合中。通过tf.trainable_variables()可以查询。其op标示为GraphKeys.TRAINABLE_VARIABLES
@tf_export("trainable_variables")
def trainable_variables(scope=None):return ops.get_collection(ops.GraphKeys.TRAINABLE_VARIABLES, scope)

其他集合还有model_variables,moving_average_variables。

系列文章,欢迎阅读

谢杨易:Tensorflow源码解析1 -- 内核架构和源码结构​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析2 -- 前后端连接的桥梁 - Session​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析3 -- TensorFlow核心对象 - Graph​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析4 -- 图的节点 - Operation​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析5 -- 图的边 - Tensor​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析6 -- TensorFlow本地运行时​zhuanlan.zhihu.com

谢杨易:Tensorflow源码解析7 -- TensorFlow分布式运行时​zhuanlan.zhihu.com

判定两个tensor维度相同_Tensorflow源码解析5 -- 图的边 - Tensor相关推荐

  1. Tensorflow源码解析5 -- 图的边 - Tensor

    1 概述 前文两篇文章分别讲解了TensorFlow核心对象Graph,和Graph的节点Operation.Graph另外一大成员,即为其边Tensor.边用来表示计算的数据,它经过上游节点计算后得 ...

  2. oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时

    1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...

  3. tensorflow 启动多个session_Tensorflow源码解析7 -- TensorFlow分布式运行时

    1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...

  4. ActiveMQ源码解析 建立连接

    作为一个消息中间件,有客户端和服务端两部分代码,这次的源码解析系列主要从客户端的代码入手,分成建立连接.消息发送.消息消费三个部分.趁着我昨天弄明白了源码编译的兴奋劲头还没过去,今天研究一下建立连接的 ...

  5. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...

  6. *现在感觉librealsense和realsense-ros的安装挺简单的(普通X86平台)(现在发现都有两种安装方式,下载源码编译或者二进制安装)

    下面说的就是在普通X86平台上,不是在ARM平台,不在树莓派,TX2这些平台上. 之前潜意识里似乎还觉得会比较麻烦,实际我现在真正再看一下,回看一下,不是这样的.可能就像装双系统一样,实际并不麻烦,跟 ...

  7. 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖

    移动互联网的特点是大数据.高并发,对服务器往往要求分布式.高性能.高灵活等,而传统模式的Java数据库编程框架已经不再适用了. 在这样的背景下,一个Java的持久框架MyBatis走入了我们的世界,它 ...

  8. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  9. pytorch源码解析:Python层 pytorchmodule源码

    尝试使用了pytorch,相比其他深度学习框架,pytorch显得简洁易懂.花时间读了部分源码,主要结合简单例子带着问题阅读,不涉及源码中C拓展库的实现. 一个简单例子 实现单层softmax二分类, ...

最新文章

  1. 16.刚体碰撞事件监测与处理
  2. Linux free命令
  3. 怎样理解js数组中indexOf()的用法与lastIndexOf
  4. java文件共享ftp怎么访问_文件共享服务器
  5. java webrtc ns降噪_单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)...
  6. Activiti中具有单独数据库模式的多租户
  7. 关于CSS的碎片学习
  8. STM32 SPI通信(读写flash)
  9. 笨办法学 Linux 中文版 翻译完成
  10. python同花顺交易接口_开启量化第一步!同花顺iFinD数据接口免费版简易操作教程...
  11. 数字PCR(DPCR)和QPCR行业调研报告 - 市场现状分析与发展前景预测
  12. Android程序的退出
  13. ecshop始终显示全部分类
  14. windows php redis扩展安装,怎么在Windows下安装PHP的Redis扩展服务
  15. mysql存储过程多值_mysql存储过程之返回多个值的方法示例
  16. oracle asm空间利用率,ASM磁盘组状态和使用率的监控
  17. OneNote for windows10 微软商店下载UWP版本应用打不开
  18. GB/T 36964-2018《软件工程 软件开发成本度量规范》国家标准正式发布
  19. js简单交互动画,运动吧
  20. python 正则过滤四字节字符 表情字符

热门文章

  1. LiveVideoStackCon讲师热身分享 ( 六 ) —— 多媒体业务QoEQoS指标设计与监控
  2. go benchmark 性能测试 单元测试 基准测试 使用方法详解
  3. 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例
  4. 【PAT甲级 BigDecimal科学计数法转换普通数字】1073 Scientific Notation (20 分) Java开挂解法 全部AC
  5. 【PAT甲级 排序】1096 Consecutive Factors (20 分) C++ 全部AC
  6. 密码学系列之:IDEA
  7. 看动画学算法之:doublyLinkedList
  8. 深入理解HashMap和TreeMap的区别
  9. Leet Code OJ 168. Excel Sheet Column Title [Difficulty: Easy]
  10. qt 16进制字符串和十六进制数_Python字符串类型及其操作