Tensorflow入门(三)——计算图、会话

上一节
Tensorflow入门(二)——基本操作

下一节
Tensorflow入门(四)——激活函数

原文链接:https://my.oschina.net/u/876354/blog/1930490

本文在原文基础上进行细微的修改和完善。
在这里插入图片描述
计算图是TensorFlow的核心概念,使用图(Graph)来表示计算任务,由节点和边组成。TensorFlow由前端负责构建计算图,后端负责执行计算图。
为了执行图的计算,图必须在会话(Session)里面启动,会话将图的操作分发到CPU、GPU等设备上执行。
下面将介绍如何在TensorFlow里面创建会话、图以及基本操作。

1. 图(Graph)

TensorFlow Python库已经有一个默认图 (default graph),如果没有创建新的计算图,则默认情况下是在这个default graph里面创建节点和边。
在图里面添加节点非常方便。例如现在要创建这样的计算图,两个张量相加,如下图:
在这里插入图片描述
代码如下:

import tensorflow as tf

a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([3.0, 4.0], name='b')
result = tf.add(a, b)

现在默认图就有了三个节点,两个constant(),和一个add()。
为了真正使两个张量相加并得到结果,就必须在会话里面启动这个图。

2. 会话(Session)

要启动计算图,首先要创建一个Session对象。
使用tf.Session()创建会话,调用run()函数执行计算图。
如果没有传入任何创建参数,会话构造器将启动默认图。如果要指定某个计算图,则传入计算图参数(如g1),则创建会话方式为tf.Session(graph=g1)

创建会话(Session)主要有以下三种方式:

  1. 创建一个会话

    # 启动默认图
    sess = tf.Session()
    result_value = sess.run(result)
    print(result_value)
    # ==> [4.0 6.0]
    
    # 任务完成, 关闭会话.
    sess.close()
    
  2. 创建一个会话(常用)
    Session在使用完后需要关闭以释放资源,除了显式调用close外,也可以使用“with”代码块 来自动完成关闭动作。代码如下:

    with tf.Session() as sess:
        result_value = sess.run(result)
        print(result_value)
        # ==> [4.0 6.0]
    
  3. 创建一个默认的会话

    sess = tf.Session()
    with sess.as_default():
        result_value = result.eval()
        print(result_value)
    

    当指定默认会话后,可以通过tf.Tensor.eval函数来计算一个张量的取值。

  4. 创建一个交互式会话
    在交互式环境下(例如IPython),使用设置默认会话的方式来获取张量的取值更加方便。
    TensorFlow提供了一种在交互式环境下直接构建默认会话的函数:tf.InteractiveSession,该函数会自动将生成的会话注册为默认会话,使用 tf.Tensor.eval()代替 Session.run(),代码如下:

    sess = tf.InteractiveSession()
    result_value = result.eval()
    print(result_value)
    sess.close()
    

3. 构建多个计算图

在TensorFlow中可以构建多个计算图,计算图之间的张量和运算是不会共享的,通过这种方式,可以在同个项目中构建多个网络模型,而相互之间不会受影响。
使用tf.Graph()函数构建图,构建多个计算图的方式如下:

# 构建计算图g1
g1 = tf.Graph()
with g1.as_default():
    # 在计算图g1中定义变量'v',并设置初始值为0。
    v = tf.get_variable('v', initializer=tf.zeros_initializer()(shape=[1]))

# 构建计算图g2
g2 = tf.Graph()
with g2.as_default():
    # 在计算图g2中定义变量'v',并设置初始值为1。
    v = tf.get_variable('v', initializer=tf.ones_initializer()(shape=[1]))

# 在计算图g1中读取变量'v'的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('', reuse=True):
        print(sess.run(tf.get_variable('v')))
        # 输出结果[0.]

# 在计算图g2中读取变量'v'的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('', reuse=True):
        print(sess.run(tf.get_variable('v')))
        # 输出结果[1.]

4. 指定运行设备

如果电脑有多个GPU,可以在图、会话中指定要运行的设备

  1. 在图中指定运行设备

    g = tf.Graph()
    # 指定计算运行的设备。
    with g.device('/gpu:0'):
        result = tf.add(a, b)
    
  2. 在会话中指定运行设备

    with tf.Session() as sess:
        with tf.device("/gpu:0"):
            result = tf.add(a, b)
    

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

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

通过以上介绍,已经了解了图、会话的基本操作,使用图 (graph) 来表示计算任务,使用会话 (Session) 来执行图。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值