【tensorflow基础学习】计算图

 

 

初识计算图与张量

       Tensorflow程序中的计算过程可以表示为一个计算图(computation Graph,也称一个有向图(Directed Graph)),其作用与外观都可以类比程序流程图来理解,在计算图上我们可以直观地看出数据的计算流程。

        计算图中的每一个运算操作可以视为一个节点(Node),每一个节点可以有任意个输入和任意个输出。

        如果一个运算的输入取值自另一个运算的输出,那么称这两个运算存在依赖关系。存在依赖关系的两个节点之间通过边(Edge)相互连接。值得注意的是,有一类特殊的边中不存在数据流动,而是起着依赖控制(control dependencies)的作用。通俗的讲,就是让它的起始节点执行完成后再执行目标节点,以达到进行灵活的条件控制的目的。

        张量(tensor)就是在边中流动(flow)的数据,其数据类型可以在编程时事先定义,也可以根据计算图的上下文结构推断而来。

        Tensorflow之名的得来也是参考了上述所有概念。Tensor翻译成中文就是“张量”,“张量”这个概念在数学和物理学中都会涉及,在此不会对它的精确定义进行解释,可以将其简单又形象地理解为数组:flow翻译成中文就是“流“,指的是张量数据沿着边在不同的节点间流动并发生转化。

计算图—tensorflow的计算模型

        在学习程序设计的起步阶段,对于晦涩难懂的算法,我们通常会选择绘制程序流程图的方式来加强理解。相较于枯燥乏味的代码,这种图的直观性似乎更能勾起我们继续探索的欲望。在程序流程图中,可以使用不同的形状代表不同的操作,比如菱形是判断,长方形是处理等。此外,还可以使用带箭头的线指明程序的执行方向。

       计算图有着流程图类似的作用。在计算图中不同的形状代表着不同的运算。使用tensorboard工具可视化tensorflow程序的计算图时,可以在主窗口左侧看到计算图中可能会出现的所有形状及其解释。

       通常将tensorflow的计算图称为程序的“计算模型”,这个名称的得来也正是因为计算图有着将计算过程可视化的作用。详细地介绍计算图可以从简单的向量相加的例子开始:

a = tf.constant([1.0, 2.0], name="a")#常量是一种输出值永远固定的计算
b = tf.constant([3.0, 4.0], name="b")
result = a + b#常量相加的计算
print(a.graph is tf.get_default_graph())#通过graph属性可以获取张量所属的计算图
print(b.graph is tf.get_default_graph())

        编写tensorflow程序时,系统会自动维护一个默认的计算图(这样就不需要每次编写陈程序的时再自行定义计算图了)。在上面的程序运行过程中,tensorflow会自动将定义的所有计算添加到默认的计算图。通过函数get_default_graph()可以获取对当前默认计算图的引用。所以在上面的代码中,判断a和b是否属于默认的计算图会输出True,因为我们没有指定a和b属于哪一个计算图。

       使用默认的计算图可以满足一般情况下的需要,当我们需要更多的计算图来完成工作的时候,可以通过Graph()函数来生成新的计算图。对于生成的计算图,我们可以通过as_default()函数将其指定为默认的。以下代码展示了使用Graph()函数来生成两个计算图及使用as_default()函数将生成的计算图指定为默认:

#使用Graph()函数创建一个计算图
g1 = tf.Graph()
with g1.as_default():#将定义的计算图使用as_default()函数设置为默认
    #创建计算图中的变量并设置初始值
    a = tf.get_variable("a", [2], initializer=tf.ones_initializer())
    b = tf.get_variable("b", [2], initializer=tf.zeros_initializer())

#使用Graph()函数创建另一个计算图
g2 = tf.Graph()
with g2.as_default():
    a = tf.get_variable("a", [2], initializer=tf.zeros_initializer())
    b = tf.get_variable("b", [2], initializer=tf.ones_initializer())
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()#初始化计算图中的所有变量
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("a")))
        print(sess.run(tf.get_variable("b")))
#输出
#[1. 1.]
#[0. 0.]
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("a")))
        print(sess.run(tf.get_variable("b")))
#输出
#[0. 0.]
#[1. 1.]

        在这个样例程序中,我们用到了一些没有学过的知识,比如使用get_variable()函数创建变量、使用with/as运行会话,以及使用variable_scope()函数控制变量空间等,后面介绍。我门重点关注使用Graph()函数生成的两个计算图g1和g2。在初始化会话时,可以通过参数graph将创建好的计算图交由会话执行。

        对于每一个计算图,tensorflow通过5个默认的“集合(collection)”管理其中不同类别的个体。这里所谓的个体可以是张量、变量或者运行tensorflow程序所需要的队列等。下表汇总了这些集合及其管理的内容。

                                                                  Tensorflow维护的默认集合及其内容

名称

内容

Tf.GraphKeys.VARIABLES

所有变量

Tf.GraphKeys.TRAINABLE_VARIABLES

可学习(训练)的变量(一般指神经网络中的参数)

Tf.GraphKeys.SUMMARIES

日志生成相关的变量

Tf.GraphKeys.QUEUE_RUNNERS

处理输入的QueueRunner

Tf.GraphKeys.MOVING_AVERVGE_VARIABLES

所有计算了滑动平均值的变量

        函数add_to_collection()可以将个体加入一个或多个集合中,而get_collection()函数用来获取一个集合中的所有个体,这两个函数是最常用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章