Tensorflow学习02:概念介绍

1、核心概念:数据流图

先来一段比较官方的描述:

       数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。

       “线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。

     张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

具体的理解如下:

TensorFlow的工作是以数据流图所描述的模式来进行的。

数据流图描述了一组链接在一起的函数,每个函数都会将其输出传递给0个、1个或多个位于这个级联链上的其他函数。

下图是一个最简单的数据流图。加法运算用圆圈表示,它接收两个输入1和2,并将它们的和通过3输出。计算公式可以简单写为 f(1,2)=1+2=3.

    节点(node):在数据流图中,节点通常以圆圈,椭圆或方框表示,代表了对数据所做的运算或某种操作。

    再看下图,这是一个相对复杂一点的例子。其中a、b节点是输入节点,作用仅仅是传递输入值,也可以看成函数f(x)=x。C节点执行乘运算的功能,d节点执行加的功能,e节点执行求总和的功能。

      因此下图的计算过程可以写为f(5,3)=(5*3) +(5+3) = 23.也就是按如下流程工作:在a节点(可以理解为函数,下同)输入值5,在b节点输入值3,a、b节点分别把他们所获得的输入值传递给c、d节点,c节点进行乘法计算,也就是5*3=15,因此c节点输出了15,而d节点进行加法运算,也就是5+3=8,因此d节点输入了8。c、d节点都把结果再传输给e节点,e节点执行的是求和,也就是15+8=26,最终输入26。这里需要注意的是节点c和d没有依赖关系,因此他们的执行顺序是不确定。

现在我们已经理解了数据流图的含义了,那么,tensorflow中怎么定义数据流图呢?

用于表示上图的数据流图的tensorflow代码如下:

import tensorflow as tf             #导入tensorflow库,并赋予它一个别名tf,方便后续使用。

#以下定义了input节点,引用了operation: tf.constant().

#tensorflow中每个节点都被称为一个operation(简记为op),

#name可以用于对所创建的节点进行标识。

a = tf.constant(5,name="input_a")       #a节点

b = tf.constant(3,name="input_b")       #b节点

#定义节点c和d。注意我们无需专门对边进行定义,

#tensorflow在创建节点时已经包含了相应的op完成计算所需的全部输入。

#tensorflow会自动绘制必要的链接。
c = tf.mul(a,b,name="mul_c")                #c节点

d = tf.add(a,b,name="add_d")               #d节点

e=tf.add(c,d,name="add_e)                     #e节点

#以上完成了一个tensorflow的数据流图定义,但是它仅仅时定义,不会自己运算。

#要想得到输出结果,我们需要运行数据流图。

sess=tf.Session()

sess.run(e)

#Session对象在运行时负责对数据流图进行监督,并且是运行数据流图的主要接口。

如果我们只想的到节点c的结果,需要使用如下代码:

sess.run(c)         #这个输出不会导致整个数据流图都计算一遍,而是只运行到节点c为止。

#最后,我们建议运行一下sess.close()函数。

#虽然运算完成后会自动关闭,但手动运行一次该函数,不失为一个良好的编程习惯。

sess.close()

猜你喜欢

转载自my.oschina.net/abcab/blog/1814552