TensorFlow 中的所有计算都会被转化为计算图上的节点。TensorFlow 是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每个计算都是计算图的一个节点,而节点之间的边描述了计算之间的依赖关系。
import sys
sys.path.append('E:/zlab/')
from plotnet import draw_feed_forward, DynamicShow
TensorFlow 的计算模型是有向图,采用数据流图 (Data Flow Graphs),其中每个节点代表一些函数或计算,而边代表了数值、矩阵或张量。
数据流图是用于定义计算结构的。在 TensorFlow 中,数据流图本质上是一组链接在一起的函数,每个函数都会将其输出传递给 0 个、1 个或多个位于这个级联链上的其他函数。
with DynamicShow((6, 3), '计算图.png') as d: # 隐藏坐标轴
seq_list = draw_feed_forward(d.ax, num_node_list=[2, 1, 1])
seq_list[0][0].text('$1$')
seq_list[0][1].text('$2$')
seq_list[1][0].text('$+$')
seq_list[2][0].text('$3$')

如上图,我们使用数据流图表示了 1+2=3
这一个运算。

我们也可以将其抽象化:
with DynamicShow((6, 3), '计算图1.png') as d: # 隐藏坐标轴
seq_list = draw_feed_forward(d.ax, num_node_list=[2, 1, 1])
seq_list[0][0].text('$a$')
seq_list[0][1].text('$b$')
seq_list[1][0].text('$c$')
seq_list[2][0].text('$d$')

我们也可以将上述过程简化为:

将节点 c 与 d 合并,若 c 表示求和运算,d 表示非线性变换,则上图可以看作是一个神经元。
除了节点和边的概念,数据流图还有一个十分关键的概念:依赖关系。

构建数据流图时,需要两个基础元素:点(node)和边(edge)。
• 节点:在数据流图中,节点通常以圆、椭圆或方框表示,代表对数据的运算或某种操作。
• 边:数据流图是一种有向图,“边”通常用带箭头线段表示,实际上,它是节点之间的连接。指向节点的边表示输入,从节点引出的边表示输出。输入可以是来自其他数据流图,也可以表示文件读取、用户输入。输出就是某个节点的“操作(Operation,下文简称Op)”结果。
除了上述两个概念之外,下面3个概念也很重要,在后面的章节会详细介绍,这里仅做简单介绍。
(1)Session(会话):根据上下文(context),会话负责管理协调整个数据流图的计算过程。光有数据流图还不够,如果想执行数据流图所描述的计算,还得配备一个专门的会话,来负责图计算。
(2)Op(操作):就是数据流图中的一个节点,代表一次基本的操作过程。
(3)Tensor(张量):在TensorFlow 中,所有计算数据的格式,都是一个n维数组,如 t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],就是一个2维张量。
总结一下TensorFlow的工作流程,实际上它体现出来的是一个“惰性”方法论。
(1)构建一个计算图。图中的节点可以是TensorFlow支持的任何数学操作。
(2)初始化变量。将前期定义的变量赋初值。
(3)创建一个会话。这才是图计算开始的地方,也是体现它“惰性”的地方,也就是说,仅仅构建一个图,这些图不会自动执行计算操作,而是还要显式提交到一个会话去执行,也就是说,它的执行,是滞后的。
(4)在会话中运行图的计算。把编译通过的合法计算流图传递给会话,这时张量(tensor)才真正“流动(flow)”起来。
(5)关闭会话。当整个图无需再计算时,则关闭会话,以回收系统资源。
| 留言与评论(共有 0 条评论) |