TensorFlow结构
TensorFlow系统架构的模式
系统架构图其中设备层、数据操作层、图计算层是TensorFlow的核心层。
设备层
设备层中的网络通信层中gRPC(google Remote Procedure Call Protocal)和远程数据存取(Remote DIrect Memory Access),直接为分布式计算提供了支持。设备管理层包括TensorFlow分别在CPU、GPU、FPGA等设备上的实现,对上层提供了一个统一的接口,屏蔽掉了底层。
数据操作层
包括卷积函数、激活函数等操作
图计算层
本地计算图和分布式计算图的实现
API和应用层
API层对深度学习各种网络模型的实现
设计理念
将图的定义和图的运行完全分开
所以TensorFlow可以认为是一个“符号主义”的库。
符号式计算一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译。但这里数据流图还仅仅是一个空壳,只有让输入进入到数据流图中,在整个模型中形成数据流,才可以形成输出值。
会话提供了操作运行和Tensor求值的环境。
TensorFlow中涉及的运算都要放在图中,而图的运行只发生在会话(session)中。
例如:
import tensorflow as tf
#创建图
a = tf.constant([1.0,2,0])
b = tf.constant([3.0,4.0])
c= a * b
#创建会话
sess = tf.Session()
#计算c
print sess.run(c) #矩阵运算
sess.closs #关闭session
编程模型
TensorFlow是用数据流图做计算的,因此先要创建一个数据流图。TensorFlow的数据流图是由节点和边组成的有向无环图。Tensor代表了 数据流图中的边,而Flow这个动作代表了数据流图中节点所做的操作。
编程模型
边
TensorFlow的边有两种连接关系数据依赖和控制依赖。实线边表示数据依赖,代表数据,即张量(任意维度的数据统称为张量)。在机器学习算法中,张量在数据流图中华从前向后流动一遍就完成了一次前向传播,而残差从后面向前流动一遍就完成了一次反向传播。
虚线边表示控制依赖(control dependency),源节点必须在目的节点开始执行前完成执行。例如:
tf. Graph.control_dependencies(control_inputs)
节点
图中的节点又称为算子,它代表一个操作(operation),一般用来表示施加的数学运算,也可以表示feed in的起点和 push out的终点。
其他
创建图
import tensorflow as tf
#创建一个常量运算符,产生一个1×2矩阵
matrix1 = tf.constant([[3.,3.]])
#创建另外一个常量运算符,产生一个2×1矩阵
matrix2 = tf.constant([[2.],[2.]])
#创建一个矩阵乘法运算,把matrix1和matrix2作为输入
#返回值produce代表矩阵运算的乘法结果
produce = tf.matmul(matrix1,matrix2)
会话
启动图的第一步是建立一个session会话。一般的模式是,建立会话,此时会生成一张空图,在会话中添加节点和边,形成一张图,然后执行。
要创建一张图并运行操作的类,在Python的API中使用tf.Session
with tf.Session() as sess:
result = sess.run([produce])
print result
在调用Session对象的run()方法来执行图时,传入一些Tensor ,这个过程叫feed in ,返回的类型根据输入的类型决定,这个过程叫fetch
会话是一个与图交互的桥梁,一个会话可以有多个图,会话可以修改图的结构,也可以向图中加入数据进行运算。两个重要的API接口是Extend 和run。
设备
设备是值一块可以用来运算并且拥有自己的地址空间的硬件。
分配运算资源:
with tf.Session() as sess:
#指定在第二个GPU上运行
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3.,3.]])
matrix2 = tf.constant([[2.],[2.]])
produce = tf.matmul(matrix1,matrix2)
变量
变量是一种特殊的数据,它在图中有固定的位置,不像普通的张量那样可以流动。
#创建一个变量,初始化为0
state = tf.Variable(0,name = "counter")
#创建一个张量常量
input1 = tf.constant(3.0)
另外TensorFlow还提供了填充机制,可以再构建图时使用 tf.placeholder()临时替代任何任意操作的张量。在调用Session对象的run()方法去执行图的时候,使用填充数据作为调用的参数,调用结束后,填充数据就会消失。
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1,input2)
#建立会话
with tf.Session() as sess:
print sess.run([output],feed_dict={input1:[7.],input2:[2.]})
#输出 [array([ 14.],dtype=float32)]
内核
operation是对抽象操作(add,etc~~~)的一个统称,而内核则是能够运行在特定设备上的一种对操作的实现。同一个操作可能会对应多个内核。