TensorFlow入门:计算图

    xiaoxiao2022-07-12  137

    目录

    1. 介绍

    2. 什么是数据流图(Data Flow Graph)?

    3. 基本概念

    3.1 计算图(The computation graph)

    1. 构建图

    2. 启动图


    1. 介绍

           TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。它是谷歌基于DistBelief进行研发的第二代人工智能学习系统。2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源。 

    2. 什么是数据流图(Data Flow Graph)?

            数据流图用“节点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以运输“size可动态调整”的多维数组,即“张量”(tensor)。一旦输入端所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行计算。

                                                                        

    3. 基本概念

     使用TensorFlow前必须明白的基本概念: 

    图(Graph):图描述了计算的过程,TensorFlow使用图来表示计算任务。 张量(Tensor):TensorFlow使用tensor表示数据。每个Tensor是一个类型化的多维数组。 操作(op):图中的节点被称为op(operation的缩写),一个op获得0个或多个Tensor,执行计算,产生0个或多个Tensor。 op=节点会话(Session):图必须在称之为“会话”的上下文中执行。会话将图的op分发到诸如CPU或GPU之类的设备上执行。 变量(Variable):运行过程中可以被改变,用于维护状态。

    3.1 计算图(The computation graph)

           Tensorflow是一种计算图模型,即用图的形式来表示运算过程的一种模型。Tensorflow程序一般分为图的构建和图的执行两个阶段。构建阶段,也称为图的定义阶段,在构建阶段op的执行步骤被描述成一个图,每次运算的的结果以及原始的输入数据都可称为一个节点(operation ,缩写为op)。在执行阶段,使用会话执行图中的op。

    1. 构建图

           构建阶段:只在图中定义所需要的运算,而没有去执行运算

           构建图的第一步是创建源op(sources op)。源op不需要任何输入,例如常量(Constant)。源op的输出被传递给其他op做运算。

          在TensorFlow的Python库中,op构造器的返回值代表这个op的输出。这些返回值可以作为输入传递给其他op构造器。

          TensorFlow的Python库中包含了一个默认的graph,可以在上面使用添加节点。如果你的程序需要多个graph那就需要使用Graph类管理多个graph。

    import tensorflow as tf # 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点,加到默认图中。构造器的返回值代表该常量 op 的返回值. matrix1 = tf.constant([[3., 3.]]) # 创建另外一个常量 op, 产生一个 2x1 矩阵. matrix2 = tf.constant([[2.],[2.]]) # 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入。返回值 'product' 代表矩阵乘法的结果. product = tf.matmul(matrix1, matrix2)

            默认图中包含了3个节点:两个constant() op和一个matmul() op。为了真正的执行矩阵相乘运算,并得到矩阵乘法的结果,你必须在会话中启动这个图。

    2. 启动图

           执行阶段:也就是在会话(session)中执行图模型中定义好的运算。

           构造阶段完成后,才能在会话中启动图。启动图的第一步是创建一个Session对象。如果没有任何参数,会话构造器将启动默认图。

    # 启动默认图模型 sess = tf.Session() # 调用run()方法启动、运行图模型 result = sess.run(product) print result # ==> [[ 12.]] # 任务完成, 关闭会话. sess.close() # 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. # 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回 # 矩阵乘法 op 的输出. # # 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的. # # 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行. # # 返回值 'result' 是一个 numpy `ndarray` 对象.

    Session对象在使用完成或需要关闭以释放资源。除了显示调用close外,也可以使用“with”代码块来自动完成关闭动作。

    with tf.Session() as sess: result = sess.run([product]) print result

           此外,我们还可以利用CPU或GPU等计算资源分布式执行图的运算过程。一般我们无需显示的指定计算资源,Tensorflow可以自动地进行识别,如果检测到我们的GPU环境,会优先的利用GPU环境执行我们的程序。但如果我们的计算机中有多于一个可用的GPU,这就需要我们手动的指派GPU去执行特定的op。

           如果检测到GPU,TensorFlow会使用第一个GPU来执行操作。如果机器上有多个GPU,除第一个GPU外的其他GPU是不参与计算的,为了使用这些GPU,你必须将op明确指派给他们执行。with…Device语句用来指派特定的CPU或GPU执行操作:

    with tf.Session() as sess: with tf.device("/gpu:1"): matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) ...

    设备用字符串进行标识. 目前支持的设备包括: 

    “/cpu:0”: 机器的 CPU. “/gpu:0”: 机器的第一个 GPU, 如果有的话. “/gpu:1”: 机器的第二个 GPU, 以此类推.

           Tensorflow中还提供了默认会话的机制,我们通过调用函数as_default()生成默认会话。

    import tensorflow as tf matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) sess = tf.Session() with sess.as_default(): print(sess.eval())

            我们在启动默认会话后,可以通过调用eval()函数,直接输出变量的内容。

            有时,我们需要在Jupyter或IPython等python交互式环境开发。Tensorflow为了满足用户的这一需求,提供了一种专门针对交互式环境开发的方法InteractiveSession():

    import tensorflow as tf matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) sess = tf.InteractiveSession() print(sess.eval())

            以上就是交互式环境中经常会使用的InteractiveSession()方法,其创建sess对象后,可以直接输出运算结果。

           为什么Tensorflow要使用图模型?图模型有什么优势呢?

           首先,图模型的最大好处是节约系统开销,提高资源的利用率,可以更加高效的进行运算。因为我们在图的执行阶段,只需要运行我们需要的op,这样就大大的提高了资源的利用率;其次,这种结构有利于我们提取中间某些节点的结果,方便以后利用中间的节点去进行其它运算;还有就是这种结构对分布式运算更加友好,运算的过程可以分配给多个CPU或是GPU同时进行,提高运算效率;最后,因为图模型把运算分解成了很多个子环节,所以这种结构也让我们的求导变得更加方便。

    参考:

    1. Tensorflow中文社区

    2. TensorFlow 教程 - 新手入门笔记

    最新回复(0)