TensorFlow 学习(三) 图和会话

    数据流图是一种常用于并行计算的编程模型。大多数TensorFlow程序都是从数据流图构建阶段开始,这些函数可构建新的 tf.Operation(节点)和 tf.Tensor(边缘)对象并将它们添加到 tf.Graph 实例中。TensorFlow 提供了一个默认图,此图是同一上下文中的所有 API 函数的明确参数

tf.graph图信息

  • 图结构。 图的节点和边缘,表示各个操作组合在一起的方式,但不规定它们的使用方式。图结构与汇编代码类似:检查图结构可以传达一些有用的信息,但它不包含源代码传达的所有实用上下文信息。

  • 图集合。 TensorFlow 提供了一种在 tf.graph 中存储 元数据集合 的通用机制。tf.add_to_collection 函数允许您将对象列表与一个键关联(其中 tf.GraphKeys 定义了部分标准键),tf.get_collection 允许您查询与某个键关联的所有对象。TensorFlow 库的许多部分会使用此资源:例如,当您创建 tf.Variable  时,系统会默认将其添加到表示“全局变量”和“可训练变量”的集合中。当您后续创建 tf.train.Saver 或  tf.train.Optimizer 时,这些集合中的变量将用作默认参数。

tf.graph 图创建

  • 调用 可创建单个 tf.Operation,该操作可以生成值 42.0,将该值添加到默认图中,并返回表示常量值的 tf.Tensor。

  • 调用 tf.matmul(x, y) 可创建单个 tf.Operation,该操作会将  tf.Tensor 对象 x 和 y 的值相乘,将其添加到默认图中,并返回表示乘法运算结果的 tf.Tensor

  • 执行 v = tf.Variable(0) 可向图添加一个 tf.Operation,该操作可以存储一个可写入的张量值,该值在多个 tf.Session.run 调用之间保持恒定。tf.Variable 对象会封装此操作,并可以像张量一样使用,读取已存储的值的当前值。tf.Variable 对象也具有 assign 和 assign_add 等方法,这些方法可创建 tf.Operation 对象,这些对象在执行时将更新已存储的值。

  • 调用 tf.train.Optimizer.minimize 可将操作和张量添加到计算梯度的默认图中,并返回一个 tf.Operation,该操作在运行时会将这些梯度应用到一组变量上。

在会话中运行图 tf.Session

  1. 运行图的结构
  2. 分配资源计算
  3. 掌握资源(变量的资源,队列,线程)

    tf.Session : 会话对象封装执行操作对象和计算张量对象的环境。Session 也会分配内存来存储当前变量的值

    TensorFlow 使用 tf.Session 类对象可以访问本地的设备,也可以访问使用分布式TensorFlow 运行时的远程设备。由于 tf.Session 拥有物理资源(例如 GPU 和网络连接),因此通常(在 with 代码块中)用作上下文管理器,并在您退出代码块时自动关闭会话。您也可以在不使用 with 代码块的情况下创建会话,但应在完成会话时明确调用 tf.Session.close 以便释放资源

     注意:较高阶的 API(例如 tf.train.MonitoredTrainingSession 或 tf.estimator.Estimator)将为您创建和管理 tf.Session。这些 API 接受可选的 target 和 config 参数(直接接受,或作为 tf.estimator.RunConfig 对象的一部分)。

使用会话两种方式代码运行例子:

import tensorflow as tf

# 创建张量节点。op操作
a = tf.constant(3, name="a")
b = tf.constant(4, name = "b")
addsum = tf.add(a,b, name = "c")

# 两种方式运行会话:
# 1. 使用上下文管理器 with
with tf.Session() as sess:
    print("with: {0}".format(sess.run(addsum)))

# 2. 使用 close 方式
sess = tf.Session()
print("run: %d" % (sess.run(addsum)))
sess.close()

#################################
#            运行结果            #
#################################
with: 7
run: 7

构建 tf.Graph 代码运行例子

  • tf.Graph 会定义 tf.Operation 对象的命名空间:单个图中的每个操作必须具有唯一名称。如果请求的名称已被占用,TensorFlow 将在操作名称上附加 "_1"、"_2" 等字符,以便确保名称的唯一性。通过使用多个明确创建的图,您可以更有效地控制为每个操作指定什么样的名称。
  • 默认图会存储与添加的每个 tf.Operation 和 tf.Tensor 有关的信息。如果您的程序创建了大量未连接的子图,更有效的做法是使用另一个 tf.Graph 构建每个子图,以便回收不相关的状态。
import tensorflow as tf
# 构建图
gr = tf.Graph()

# 默认的这张图,相当于是给程序分配一段内存
ga = tf.get_default_graph()


with gr.as_default():
    grsum = tf.constant(23)
    
# 只能运行一张图,可以在会话指定图,必须是tf.Graph()的创建图
with tf.Session(graph = gr) as sess:
    print(sess.run(grsum))

#################################
#            运行结果            #
#################################
23

tf.Session初始化三个可选参数:

  • target。如果将此参数留空(默认设置),会话将仅使用本地机器中的设备。但是,也可以指定 "xxxx:// 网址,以便指定 TensorFlow 服务器的地址,这使得会话可以访问该服务器控制的机器上的所有设备。如何创建TensorFlow服务器,可以参阅官网的 tf.train.Server 的API。
  • graph。默认情况下,新的 tf.Session 将绑定到当前的默认图,并且仅能够在当前的默认图中运行操作。如果在程序中使用了多个图,则可以在构建会话时指定明确的 tf.Graph。
  • config。可以指定一个控制会话行为的 tf.ConfigProto。部分配置选项包括:
    •  allow_soft_placement。将此参数设置为 True 可启用“软”设备放置算法,该算法会忽略尝试将仅限 CPU 的操作分配到 GPU 设备上的 tf.device 注解,并将这些操作放置到 CPU 上。
    •  cluster_def。使用分布式 TensorFlow 时,此选项允许您指定要在计算中使用的机器,并提供作业名称、任务索引和网络地址之间的映射。详情请参阅 tf.train.ClusterSpec.as_cluster_def。
    • graph_options.optimizer_options。在执行图之前使您能够控制 TensorFlow 对图实施的优化。
    • gpu_options.allow_growth。将此参数设置为 True 可更改 GPU 内存分配器,使该分配器逐渐增加分配的内存量,而不是在启动时分配掉大多数内存。
    • log_device_placement 。 是否记录设备位置   
import tensorflow as tf

# 语法 placeholder 提供占位符,run 时候通过 feed_dict 指定参数 一个字典
# 嵌套列表,元组、重载的运算符也能运行。
plt = tf.placeholder(tf.float32, [None, 3])

# feed_dict 允许调用者覆盖图中指定张量的值,提供给 placeholder 使用
# log_device_placement=True:记录设备位置
with tf.Session(config = tf.ConfigProto(log_device_placement=True)) as sess:
    print(sess.run(plt, feed_dict = {plt: [[1,2,3], [4,5,6], [2, 3, 4]]}))

#################################
#            运行结果            #
#################################
[[1. 2. 3.]
 [4. 5. 6.]
 [2. 3. 4.]]

运行结果返回值异常:

  • RuntimeError: 如果它 Session 处于无效状态(例如已关闭)。
  • TypeError: 如果 fetches 或 feed_dict 键是不合适的类型。
  • ValueError: 如果 fetches 或 feed_dict 键无效或引用 Tensor 不存在。

简单描述TensorBoard 可视化展示图

    图可视化工具是 TensorBoard 的一个组件,可在浏览器中可视化图的结构。要创建可视化图表,最简单的方法是传递 tf.Graph(在创建 tf.summary.FileWriter 时)

# 定义一个计算图,实现两个向量的加法操作
# 定义两个输入,a为常量,b为变量
a = tf.constant([1.0, 2.0, 6.0], name='a')
b = tf.Variable(tf.random_uniform([3]), name='b')

addsum = tf.add_n([a,b], name='add')

# 生成一个具有写权限的日志文件操作对象,将当前命名空间的计算图写进日志中
#  ./log 是你要存储的路径,当前路径下的log
# 到当前的路径下。命令行终端运行: tensorboard --logdir=log/
writer=tf.summary.FileWriter('./log', tf.get_default_graph())

# 关闭
writer.close()

  注:tensorboard --logdir=log/ 这条命令必须在tensorflow 环境的当前路径下运行

比如说我的链接地址访问 http://DESKTOP-L04Q0FC:6006

所看到的可视化图

tensorboad 启动过程:

  1. 创建,写入日志文件到本地

    writer=tf.summary.FileWriter('./log', tf.get_default_graph())

  2. 关闭和保存日志文件
    writer.close()

  3. 运行可视化命令,启动服务
    tensorboard –logdir=log/

  4. 打开可视化界面
    通过浏览器打开服务器访问端口http://xxx.xxx.xxx.xxx:xxxx

猜你喜欢

转载自blog.csdn.net/qq_35200479/article/details/83118327