专栏首页AI派TensorFlow修炼之道(3)——计算图和会话(Graph&Session)

TensorFlow修炼之道(3)——计算图和会话(Graph&Session)

文章内容:TensorFlow 图和会话

计算图

在计算图中,节点表示计算单位,边表示计算用到和产生的数据。 例如,在TensorFlow图中,tf.matmul操作将对应于具有两个输入边(要乘以的矩阵)和一个输出边(乘法的结果)的单个节点。

在 TensorFlow 中,系统会自动维护一个默认的计算图,可以通过 tf.get_default_graph 方法来获取当前默认的计算图。

import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
# 通过 a.graph 可以获取张量 a 所属的计算图,由于没有手动指定,所以它应该与默认的计算图是一个
print(a.graph is tf.get_default_graph())
True

图的集合(collection)

tf.add_to_collection 函数能够将资源(张量、变量或者队列资源等)加入到一个或多个集合中,tf.get_collection 可以查找一个集合中的所有资源。TensorFlow 也自动管理了一些常用的集合。

tf.GraphKeys.GLOBAL_VARIABLES  # 所有变量
tf.GraphKeys.TRAINABLE_VARIABLES # 可学习(训练)的变量(一般指神经网络中的参数)
tf.GraphKeys.SAVEABLE_OBJECTS # 日志生成相关的张量,常用于 TensorFlow 计算可视化
tf.GraphKeys.MOVING_AVERAGE_VARIABLES # 所有计算了滑动平均值的变量
'moving_average_variables'

类似Tensor的对象

许多TensorFlow操作将一个或多个tf.Tensor对象作为参数。 例如,tf.matmul接收两个tf.Tensor对象,tf.add_n接收一个n个tf.Tensor对象的列表。 为了方便起见,这些函数将接受一个类似张量的对象以替代tf.Tensor,并使用tf.convert_to_tensor方法将其隐式转换为tf.Tensor。 类似Tensor的对象包括以下类型的元素:

  • tf.Tensor
  • tf.Variable
  • numpy.ndarray
  • list(和类似张量的对象的列表)
  • 标量Python类型:bool,float,int,str

注意:默认情况下,每次使用相同的类似张量的对象时,TensorFlow将创建一个新的tf.Tensor。 如果类似张量的对象较大(例如,包含一组训练样本的numpy.ndarray),并且你多次使用它,则可能会耗尽内存。 为了避免这种情况,请在类似张量的对象上手动调用一次tf.convert_to_tensor,并使用返回的tf.Tensor。

tf.convert_to_tensor([1, 2, 3])
<tf.Tensor 'Const:0' shape=(3,) dtype=int32>

会话

创建会话

会话(Session)拥有并管理TensorFlow程序运行时的所有资源。当计算完成之后,需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的情况。

如果使用低级TensorFlow API,则可以为当前默认图创建一个tf.Session,如下所示

x = tf.constant([[37.0, -23.0], [1.0, 4.0]])
# 创建一个默认的会话
sess = tf.Session()
# 使用会话来计算相关操作
print(sess.run(x))
# 关闭会话
7sess.close()
[[ 37. -23.]
 [  1.   4.]]

使用上面的这种模式,在计算完成后,需要明确调用 close 方法来关闭会话来释放资源。如果使用上下文管理器(with语句)可以避免手动调用close方法。

with tf.Session() as sess:
  print(sess.run(x))
[[ 37. -23.]
 [  1.   4.]]

创建Session时,可以执行以下几个参数:

  • target。 如果此参数为空(默认值),则会话将仅使用本地计算机中的设备。 但是,你也可以指定一个grpc://URL来指定TensorFlow服务器的地址,它将赋予会话访问该服务器所控制的计算机上的所有设备的权限。
  • graph。 默认情况下,新的tf.Session将被绑定到当前的默认图 — 且只能运行当前默认图中的操作。 如果在程序中使用多个图,你可以在构建会话时指定一个显式的tf.Graph。
  • config。 此参数允许你指定控制会话行为的tf.ConfigProto。 例如,一些配置选项包括:
    • allow_soft_placement。 将其设置为True以启用“软”设备布局算法,当运算无法在GPU(比如:没有GPU资源、运算输入包含了对CPU计算结果的引用等)时,程序不会报错,而是调整到CPU上。
    • cluster_def。 当使用分布式TensorFlow时,此选项允许您指定计算中要使用的计算机,并提供作业名称,任务索引和网络地址之间的映射。 有关详细信息,请参见tf.train.ClusterSpec.as_cluster_def。
    • graph_options.optimizer_options。 在执行之前,可以控制TensorFlow对图的优化。
    • gpu_options.allow_growth。 将其设置为True以更改GPU内存分配器,以便逐渐增加分配的内存量,而不是在启动时分配大部分内存。

使用Session运行操作

tf.Session.run要求你指定fetches的一个列表,该列表确定返回值,可以是tf.Operation、tf.Tensor或类似张量的类型例如tf.Variable。 这些fetches确定整个tf.Graph的哪些子图必须执行以产生结果。

x = tf.constant([[37.0, -23.0], [1.0, 4.0]])
w = tf.Variable(tf.random_uniform([2, 2]))
y = tf.matmul(x, w)
output = tf.nn.softmax(y)
init_op = w.initializer
with tf.Session() as sess:
  # 运行`w`上的initializer。
  sess.run(init_op)
  # 求值`output`。 `sess.run(output)`将返回一个NumPy数组,包含计算的结果。
  print("output: %s" % sess.run(output))
  # 求值`y`和`output`。 注意`y`只计算一次,它的
  # 结果用于返回`y_val`并作为`tf.nn.softmax()`的输出。
  # op. `y_val`和`output_val`都将是NumPy数组。
  y_val, output_val = sess.run([y, output])
  print("y_val: %s" % y_val)
  print("output_val: %s" % output_val)
output: [[0.2758401  0.72415996]
 [0.15304096 0.846959  ]]
y_val: [[25.915394  26.880585 ]
 [ 0.7676319  2.4785786]]
output_val: [[0.2758401  0.72415996]
 [0.15304096 0.846959  ]]

tf.Session.run还接受一个可选的字典参数feeds,它是从tf.Tensor对象(通常是tf.placeholder张量)到值(通常是Python标量、列表或NumPy数组)的映射,将在执行中替换那些张量。 例如:

# 定义一个placeholder,期望一个由三个浮点数组成的向量# 和一个依赖于它的计算。
x = tf.placeholder(tf.float32, shape=[3])
y = tf.square(x)
with tf.Session() as sess:
  # 当你求值`y`时,提供一个值将改变返回的结果。
  print(sess.run(y, {x: [1.0, 2.0, 3.0]}))  # => "[1.0, 4.0, 9.0]"
  print(sess.run(y, {x: [0.0, 0.0, 5.0]}))  # => "[0.0, 0.0, 25.0]"
  # 引发`tf.errors.InvalidArgumentError`,因为你必须提供一个值给
  # `tf.placeholder()`,在求值依赖于它的张量时。
  sess.run(y)
[1. 4. 9.]
[ 0.  0. 25.]
---------------------------------------------------------------------------
...
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [3]
	 [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[3], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

具有多个图的编程

训练模型时,组织代码的常用方法是使用一个图来训练你的模型,另外一个图用于评估或用于对训练好的模型执行inference。

在许多情况下,推理图与训练图不同:例如,在不同情况下使用不同的操作如dropout和batch normalization。 此外,一些实用程序如tf.train.Saver默认情况下使用tf.Variable对象的名称(其名称基于底层的tf.Operation)来识别保存的检查点中的每个变量。 当这样编程时,你可以使用完全独立的Python进程来构建和执行图,或者你可以在同一个进程中使用多个图。

g_1 = tf.Graph()
with g_1.as_default():
  # 在这个作用域中创建的操作将添加到`g_1`。
  c = tf.constant("Node in g_1")

  # 在这个作用域中创建的会话将运行`g_1`中的操作。
  sess_1 = tf.Session()

g_2 = tf.Graph()
with g_2.as_default():
  # 在这个作用域中创建的操作将添加到`g_2`。
  d = tf.constant("Node in g_2")

# 另外,在构造一个`tf.Session`的时候你可以传递一个图:
# `sess_2`将允许来自`g_2`的操作。
sess_2 = tf.Session(graph=g_2)

print(c.graph is g_1)
print(sess_1.graph is g_1)

print(d.graph is g_2)
print(sess_2.graph is g_2)
True
True
True
True

作者:无邪,个人博客:脑洞大开,专注于机器学习研究。

本文分享自微信公众号 - 脑洞科技栈(naodong-open),作者:1or0

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TensorFlow修炼之道(2)——变量(Variable)

    变量(Variable)是 TensorFlow 中程序处理的共享持久状态的最佳方法。与常量不同的时,常量创建后,值便无法更改,但是变量创建后 可以修改。并且修...

    abs_zero
  • TensorFlow 修炼之道(1)——张量(Tensor)

    TensorFlow名字可以拆解为两部分:Tensor、Flow。其中,Tensor 就表示张量。

    abs_zero
  • 机器学习中你不可不知的几个算法常识

    读完 机器学习基础 之后,你已经知道了到底什么是机器学习以及机器学习的学习任务。在这篇给大家介绍一些机器学习中必须要了解的几个算法常识,这些算法常识在之后从事机...

    abs_zero
  • 深度学习之 TensorFlow(五):mnist 的 Alexnet 实现

    希希里之海
  • tensorflow的基本用法——使用MNIST训练神经网络

    Tyan
  • win10 tensorflow笔记2 MNIST机器学习入门

    这里跟官方有两处不同 1:第1行代码原文是import input_data这里的input_data是无法直接导入的。需要给出具体路径from tensor...

    我是木木酱呀
  • TensorFlow2.X学习笔记(1)--TensorFlow核心概念

    TensorFlow™ 是一个采用 数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(e...

    MiChong
  • TensorFlow2.X学习笔记(2)--TensorFlow的层次结构介绍

    MiChong
  • TensorFlow2.X学习笔记(3)--TensorFlow低阶API之张量

    TensorFlow提供的方法比numpy更全面,运算速度更快,如果需要的话,还可以使用GPU进行加速。

    MiChong
  • TensorFlow2.X学习笔记(4)--TensorFlow低阶API之AutoGraph相关研究

    而Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。

    MiChong

扫码关注云+社区

领取腾讯云代金券