文档章节

【AI实战】快速掌握TensorFlow(二):计算图、会话

雪饼
 雪饼
发布于 2018/08/20 00:17
字数 1554
阅读 1484
收藏 6


在前面的文章中,我们已经完成了AI基础环境的搭建(见文章:Ubuntu + Anaconda + TensorFlow + GPU + PyCharm搭建AI基础环境),以及初步了解了TensorFlow的特点和基本操作(见文章:快速掌握TensorFlow(一)),接下来将继续学习掌握TensorFlow。

本文主要是学习掌握TensorFlow的计算图、会话操作。

 

 
计算图是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) 来执行图。

接下来,我们将有更多讲解TensorFlow的精彩内容,敬请期待!

 

欢迎关注本人的微信公众号“大数据与人工智能Lab”(BigdataAILab),获取更多信息

 

推荐相关阅读

© 著作权归作者所有

雪饼

雪饼

粉丝 412
博文 61
码字总数 134328
作品 0
广州
私信 提问
加载中

评论(1)

ladyguigui
ladyguigui
您好,我是北京伟东教育科技有限公司商务运营人员,想邀请您做一些线上的技术项目分享以及商务性的合作,可以沟通一下吗
【AI实战】快速掌握TensorFlow(三):激励函数

到现在我们已经了解了TensorFlow的特点和基本操作(见文章:快速掌握TensorFlow(一)),以及TensorFlow计算图、会话的操作(见文章:快速掌握TensorFlow(二)),接下来我们将继续学习掌握...

雪饼
2018/08/30
1K
0
【AI实战】快速掌握Tensorflow(一):基本操作

Tensorflow是Google开源的深度学习框架,来自于Google Brain研究项目,在Google第一代分布式机器学习框架DistBelief的基础上发展起来。Tensorflow于2015年11月在GitHub上开源,在2016年4月补...

雪饼
2018/08/18
2.3K
0
【AI实战】快速掌握TensorFlow(四):损失函数

在前面的文章中,我们已经学习了TensorFlow激励函数的操作使用方法(见文章:快速掌握TensorFlow(三)),今天我们将继续学习TensorFlow。 本文主要是学习掌握TensorFlow的损失函数。 一、什...

雪饼
2018/09/02
2.3K
0
【AI实战】训练第一个AI模型:MNIST手写数字识别模型

在上篇文章中,我们已经把AI的基础环境搭建好了(见文章:Ubuntu + conda + tensorflow + GPU + pycharm搭建AI基础环境),接下来将基于tensorflow训练第一个AI模型:MNIST手写数字识别模型。...

雪饼
2018/08/11
3.7K
0
【AI实战】手把手教你训练自己的目标检测模型(SSD篇)

目标检测是AI的一项重要应用,通过目标检测模型能在图像中把人、动物、汽车、飞机等目标物体检测出来,甚至还能将物体的轮廓描绘出来,就像下面这张图,是不是很酷炫呢,嘿嘿 在动手训练自己...

雪饼
2018/08/14
11.1K
25

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部