边
Tensorflow的边有两种连接关系:数据依赖和控制依赖。实际边表示数据依赖,代表数据,即张量。任意维度的数据统称为张量。在机器学习算法中。张量在数据流图中从前往后流动一遍就完成了一次前向传播(forward propagation),而残差从后向前流动一遍就完成了一次反向传播(backward propagation)。
还有一种特殊边,一般画为虚线边,称为控制依赖(control dependency),可以用于控制操作的运行,这被用来确保happens-before关系,这类边上没有数据流过,但源节点必须在目的节点开始执行前完成执行。常用代码如下:
tf.Graph.control_dependencies(control_inputs)
节点
图中的节点又称为算子,它代表一个操作(operation,OP),一般用来表示施加的数学运算,也可以表示数据的输入(feed in)的起点以及输出(push out)的重点,或者是读取/写入持久变量(persistent variable)的终点。下表列举了一些Tensorflow实现爱你的算子。算子支持表所示的各种张量的各种数据属性,并且需要在建立图的时候确定下来。
与操作相关的代码位于tensorflow\python\ops目录下。
以数学运算为例,代码为上述目录下的manip_ops.py
,里面定义了add、subtract、multiply、scalar_mul、div、divide、truediv、floordiv等数学运算,每个函数里面调用了gen_math_ops.py中的方法,这个文件是在编译(安装时)Tensorflow时生成的,位于Python库Python\Python36\site-packages\tensorflow\python\ops\gen_math_ops.py中,随后又调用了tensorflow\core\kernels下面的核函数的实现。
再例如,数组运算的代码位于tensorflow\python\ops\array_ops.py中,里面定义了concat、split、size、rank等运算,每个函数都调用了gen_array_ops.py中的方法,这个文件也是在编译Tensorflow是生成的,位于Python库Python\Python36\site-packages\tensorflow\python\ops\gen_array_ops.py中。随后又调用了tensorflow\core\kernels下面的核函数的实现。
图
把操作任务描述成有向无环图。那么,如何构建一个图呢?构建图的第一步是创建各个节点。具体如下:
importtensorflowastf
"""
创建一个常量运算操作,产生一个1*2矩阵
"""
matrx1 = tf.constant([[3.,3.]])
"""
创建一个常量运算操作,产生一个2*1矩阵
"""
matrx2 = tf.constant([[2.],[2.]])
"""
创建一个矩阵乘法,把matrix1和matrix2作为输入
返回值product代表矩阵乘法的结果
"""
product = tf.matmul(matrx1, matrx2)
会话
启动图的第一步是创建一个Session对象。会话(session)提供在图中执行操作的一些方法,一般模式是,建立会话,此时会生成一张空图,在会话中添加节点和边,形成一张图,然后执行。
要创建一张图并运行操作的类,在Python的API中使用tf.Session,在C++的API中使用tensorflow::Session。示例如下:
"""
创建会话
"""
withtf.Session()assess:
print(sess.run([product]))
sess.close()
在调用Session对象的run()方法来执行图时,传入一些Tensor,这个过程叫做填充(feed);返回的结果类型根据输入的类型而定,这个过程叫做取回(fetch).
与会话相关的代码位于tensorflow\python\client\session.py.
会话是图交互的一个桥梁,一个会话可以有多个图,会话可以修改图的结构,也可以往图中注入数据进行计算.因此,会话主要有两个API接口;Extend和Run.Extend操作是在Graph中添加节点和边,Run操作是输入计算的节点和填充必要的数据后,进行运算并输出运算结果.
设备
设备(device)是指一块可以用来计算并且拥有自己的地址空间的硬件,如GPU和CPU.
Tensorflow为了实现分布式执行操作,充分利用计算资源,可以明确指定操作在那个设备上执行,具体如下:
"""
创建会话
"""
withtf.Session()assess:
#指在第二个GPU上运行
withtf.device("/gpu:1"):
matrx1 = tf.constant([[3.,3.]])
matrx2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrx1, matrx2)
与设备相关的源代码位于tensorflow\python\framework\device.py
变量
变量(variable)是一种特殊的数据,它在图中有固定的位置,不像普通张量那样可以流动。例如,创建一个张量变量,使用tf.Variable()构造函数,这个构造函数需要一个初始值,初始值的形状和类型决定了这个变量的形状和类型:
"""
变量-创建一个变量,初始化标量0
"""
state = tf.Variable(,name="counter")
创建一个常量张量:
"""
创建一个常量张量
"""
input1 = tf.constant(3.0)
Tensorflow还提供了填充机制,可以在构建图时使用tf.placeholder()临时替代任意操作的张量,在调用Session对象的run()方法去执行图时,使用填充数据作为调用的参数,调用结束后,填充数据就消失。代码如下:
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
withtf.Session()assess:
print(sess.run([output],feed_dict={input1:[7.],
input2:[2.]}))
#输出[array([14.], dtype=float32)]
sess.close()
与变量相关的代码位于tensorflow\python\ops\variables.py。
内核
我们知道操作(operation)是对抽象操作(如matmul或add)的一个统称,而内核(kernel)则是能够运行在特定设备(如CPU、GPU)上的一种对操作的实现。因此,同一个操作可能会对应多个内核。
当自定义一个操作时,需要把新操作和内核通过注册的方式添加到系统中。
好看请点这里~
领取专属 10元无门槛券
私享最新 技术干货