张量,边,节点,图,会话,设备,变量

TensorFlow 是用数据流图做计算的,因此我们先创建一个数据流图(也称为网络结构图),
如图 下图 所示,看一下数据流图中的各个要素。

  图 讲述了 TensorFlow 的运行原理。图中包含输入(input)、塑形(reshape)、Relu 层(Relulayer)、Logit 层(Logit layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD 训练(SGD Trainer)等部分,是一个简单的回归模型。

  它的计算过程是,首先从输入开始,经过塑形后,一层一层进行前向传播运算。Relu 层(隐藏层)里会有两个参数,即 W h1 和 b h1 ,在输出前使用 ReLu(Rectified Linear Units)激活函数做非线性处理。然后进入 Logit 层(输出层),学习两个参数 W sm 和 b sm 。用 Softmax 来计算输出结果中各个类别的概率分布。用交叉熵来度量两个概率分布(源样本的概率分布和输出结果的概率分布)之间的相似性。然后开始计算梯度,这里是需要参数 W h1 、b h1 、W sm 和 b sm ,以及交叉熵后的结果。随后进入 SGD 训练,也就是反向传播的过程,从上往下计算每一层的参数,依次进行更新。也就是说,计算和更新的顺序为 b sm 、W sm 、b h1 和 W h1 。

                                

  顾名思义,TensorFlow 是指“张量的流动”。TensorFlow 的数据流图是由节点(node)和边edge)组成的有向无环图(directed acycline graph,DAG)。TensorFlow 由 Tensor 和 Flow 两部分组成,Tensor(张量)代表了数据流图中的边,而 Flow(流动)这个动作就代表了数据流图中节点所做的操作

  

    TensorFlow 的边有两种连接关系:数据依赖和控制依赖。其中,实线边表示数据依赖代表数据,即张量。任意维度的数据统称为张量。在机器学习算法中,张量在数据流图中从前往后流动一遍就完成了一次前向传播(forword propagation),而残差 从后向前流动一遍就完成了一次反向传播(backword propagation)。

  注:在数理统计中,残差是指实际观测值于训练的估计值之间的差

    还有一种特殊边,一般画为虚线边,称为控制依赖(control dependency),可以用于控制操作的运行,这被用来确保 happens-before 关系,这类边上没有数据流过,但源节点必须在目的节点开始执行前完成执行。常用代码:

1

tf.Graph.control_dependencies(control_inputs)

  Tensorflow支持的张量的数据属性:

  

  有关图及张量的实现的源代码均位于 tensorflow-1.1.0/tensorflow/python/framework/ops.py

 

  节点

     图中的节点又称为算子,它代表一个操作(operation,OP),一般用来表示施加的数学运算,也可以表示数据输入(feed in)的起点以及输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。下表列举了一些 TensorFlow 实现的算子。算子支持表所示的张量的各种数据属性,并且需要在建立图的时候确定下来。

   

   与操作相关的代码位于 tensorflow-1.1.0/tensorflow/python/ops/目录下。以数学运算为例,代码为上述目录下的 math_ops.py,里面定义了 add、subtract、multiply、scalar_mul、div、divide、truediv、floordiv 等数学运算,每个函数里面调用了 gen_math_ops.py 中的方法,这个文件是在编译(安装时)TensorFlow 时生成的,位于 Python 库 site-packages/tensorflow/python/ops/gen_math_ops.py 中,随后又调用了 tensorflow1.1.0/tensorflow/core/kernels/下面的核函数实现。再例如,数据运算的代码位于 tensorflow-1.1.0/tensorflow/python/ops/array_ops.py 中,里面定义了concat、split、slice、size、rank 等运算,每个函数都调用了 gen_array_ops.py 中的方法,这个文件也是在编译TensorFlow 生成的,位于Python 库site-packages/tensorflow/python/ops/gen_array_ops.py中,随后又调用了 tensorflow-1.1.0/tensorflow/core/kernels/下面的核函数实现。

  

   把操作任务描述成有向无环图。那么,如何构建一个图呢?构建图的第一步是创建各个节

点。具体如下:

1

2

3

4

5

6

7

8

import tensorflow as tf

# 创建一个常量运算操作,产生一个 1×2 矩阵

matrix1 = tf.constant([[3.3.]])

# 创建另外一个常量运算操作,产生一个 2×1 矩阵

matrix2 = tf.constant([[2.],[2.]])

# 创建一个矩阵乘法运算 ,把 matrix1 和 matrix2 作为输入

# 返回值 product 代表矩阵乘法的结果

product = tf.matmul(matrix1, matrix2)

  会话

    启动图的第一步是创建一个 Session 对象。会话(session)提供在图中执行操作的一些方法。一般的模式是,建立会话,此时会生成一张空图,在会话中添加节点和边,形成一张图,然后执行。要创建一张图并运行操作的类,在 Python 的 API 中使用 tf.Session,在 C++ 的 API 中使用tensorflow::Session。示例如下:

1

2

3

with tf.Session() as sess:

result = sess.run([product])

print result

  在调用 Session 对象的 run()方法来执行图时,传入一些 Tensor,这个过程叫填充(feed);返回的结果类型根据输入的类型而定,这个过程叫取回(fetch)。

  与会话相关的源代码位于 tensorflow-1.1.0/tensorflow/python/client/session.py。

  会话是图交互的一个桥梁,一个会话可以有个图,会话可以修改图的结构,也可以往图中注入数据进行计算。因此,会话主要有两个 API 接口:Extend 和 Run。Extend 操作是在 Graph中添加节点和边,Run 操作是输入计算的节点和填充必要的数据后,进行运算,并输出运算结果。

   设备

    设备(device)是指一块可以用来运算并且拥有自己的地址空间的硬件,如 GPU 和 CPU。TensorFlow 为了实现分布式执行操作,充分利用计算资源,可以明确指定操作在哪个设备上执行。具体如下:

1

2

3

4

5

6

with tf.Session() as sess:

# 指定在第二个 gpu 上运行

    with tf.device("/gpu:1"):

        matrix1 = tf.constant([[3.3.]])

        matrix2 = tf.constant([[2.],[2.]])

        product = tf.matmul(matrix1, matrix2)       

  与设备相关的源代码位于 tensorflow-1.1.0/tensorflow/python/framework/device.py

  变量

   ·  变量(variable)是一种特殊的数据,它在图中有固定的位置,不像普通张量那样可以流动。例如,创建一个变量张量,使用 tf.Variable()构造函数,这个构造函数需要一个初始值,初始值的形状和类型决定了这个变量的形状和类型:

1

2

3

4

# 创建一个变量,初始化为标量 0

state = tf.Variable(0, name="counter")

#创建一个常量张量:

input1 = tf.constant(3.0)

  TensorFlow 还提供了填充机制,可以在构建图时使用 tf.placeholder()临时替代任意操作的张量,在调用 Session 对象的 run()方法去执行图时,使用填充数据作为调用的参数,调用结束后,填充数据就消失。代码示例如下:

 

1

2

3

4

5

6

input1 = tf.placeholder(tf.float32)

input2 = tf.placeholder(tf.float32)

output = tf.multiply(input1, input2)

with tf.Session() as sess:

    print sess.run([output], feed_dict={input1:[7.], input2:[2.]})

# 输出 [array([ 14.], dtype=float32)]

  与变量相关的源代码位于 tensorflow/tensorflow/python/ops/variables.py。

  3.7、内核

    我们知道操作(operation)是对抽象操作(如 matmul 或者 add)的一个统称,而内核(kernel)则是能够运行在特定设备(如 CPU、GPU)上的一种对操作的实现。因此,同一个操作可能会对应多个内核。

  当自定义一个操作时,需要把新操作和内核通过注册的方式添加到系统中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值