发新帖

TensorFlow 学习 -- 编程人员指南: 低级别 API 简介 (1)

[复制链接]
610 0

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
本帖最后由 大白白 于 2018-7-6 15:41 编辑

转载自:https://tensorflow.google.cn/programmers_guide/low_level_intro?hl=zh-CN

本指南旨在指导您使用低级别 TensorFlow API (TensorFlow Core) 开始编程。您可以学习执行以下操作:
  • 管理您自己的 TensorFlow 程序 (tf.Graph) 和 TensorFlow 运行时 (tf.Session),而不是依靠 Estimator 来管理它们。
  • 使用 tf.Session 来运行 TensorFlow 指令。
  • 在此低级别环境中使用高级别组件(数据集feature_columns)。
  • 构建自己的训练循环,而不是使用 Estimator 提供的训练循环。

我们建议尽可能使用更高级别的 API 来构建模型。了解 TensorFlow Core 的重要性如下:
  • 如果您能够直接使用低级别的 TensorFlow 指令,实验和调试都会更直接。
  • 您在使用更高级别的 API 时,能够理解其内部工作原理。


设 置
在使用本指南之前,请先安装 TensorFlow
要充分理解本指南中的内容,您应当具备以下方面的知识:
  • 如何使用 Python 编程。
  • 对阵列有所了解。
  • 理想情况下,最好对机器学习有一定的了解。
您随时可以启动 python,并按照以下演示进行操作。运行以下行来设置您的 Python 环境:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import numpy as np
import tensorflow as tf

张 量 值
TensorFlow 中的核心数据单位是张量。一个张量由一组形成阵列(任意维数)的原始值组成。张量的是它的维数,而它的形状是一个整数元组,指定了阵列每个维度的长度。以下是张量值的一些示例:

3. # a rank 0 tensor; a scalar with shape [],
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
TensorFlow 使用 numpy 阵列来表示张量
TensorFlow Core 演示
您可以将 TensorFlow Core 程序看作由两个互相独立的部分组成:


计算图是排列成一个图的一系列 TensorFlow 指令。图由两种类型的对象组成。
  • 指令(或“op"):图的节点。 指令说明的是消耗和生成张量的计算。
  • 张量:图的边。它们代表将流经图的值。大多数 TensorFlow 函数会返回 tf.Tensors。
重要提示:tf.Tensors 不具有值,它们只是计算图中元素的手柄。
我们来构建一个简单的计算图。最基本的指令是一个常量。构建指令的 Python 函数将一个张量值作为输入值。生成的指令不需要输入值。它在运行时输出的是被传递给构造函数的值。我们可以创建如下所示的两个浮点数常量 a 和 b:

a = tf.constant(3.0, dtype=tf.float32)
b = tf.constant(4.0) # also tf.float32 implicitly
total = a + b
print(a)
print(b)
print(total)
打印语句会生成:

Tensor("Const:0", shape=(), dtype=float32)
Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("add:0", shape=(), dtype=float32)
请注意,打印张量并不会如您可能预期的那样输出值 3.0、4.0 和 7.0。上述语句只会构建计算图。这些 tf.Tensor 对象仅代表将要运行的指令的结果。
图中的每个指令都拥有唯一的名称。这个名称不同于使用 Python 分配给相应对象的名称。张量是根据生成它们的指令命名的,后面跟着输出索引,如上文的 "add:0" 所示。
TensorBoard
TensorFlow 提供了一个名为 TensorBoard 的实用程序。TensorBoard 的诸多功能之一是将计算图可视化。您只需要使用几个简单的命令就能轻松完成此操作。
首先将计算图保存为 TensorBoard 摘要文件,具体操作如下所示:

writer = tf.summary.FileWriter('.')
writer.add_graph(tf.get_default_graph())
这将在当前目录中生成一个 event 文件,其名称格式如下:

events.out.tfevents.{timestamp}.{hostname}
现在,在新的终端中使用以下 shell 命令启动 TensorBoard:

tensorboard --logdir .
接下来,在您的浏览器中打开 TensorBoard 的图页面,您应该会看到与以下图形类似的图:
要详细了解 TensorBoard 的计算图可视化工具,请参阅 TensorBoard:图的直观展示


会话 (Session)
要评估张量,您需要实例化一个 tf.Session 对象(通常被称为会话)。会话会封装 TensorFlow 运行时的状态,并运行 TensorFlow 指令。如果说 tf.Graph 像一个 .py 文件,那么 tf.Session 就像一个可执行的 python。
下面的代码会创建一个 tf.Session 对象,然后调用其 run 方法来评估我们在上文中创建的 total 张量:

sess = tf.Session()
print(sess.run(total))
当您使用 Session.run 请求输出节点时,TensorFlow 会回溯整个图,并流经提供了所请求的输出节点对应的输入值的所有节点。因此此指令会打印预期的值 7.0:

7.0
您可以将多个张量传递给 tf.Session.run。run 方法以透明方式处理元组或字典的任何组合,如下例所示:

print(sess.run({'ab':(a, b), 'total':total}))
它返回的结果拥有相同的布局结构:

{'total': 7.0, 'ab': (3.0, 4.0)}
在调用 tf.Session.run 期间,任何 tf.Tensor 都只有单个值。例如,以下代码调用 tf.random_uniform 来生成一个 tf.Tensor,后者会生成随机的三元素矢量(值位于 [0,1)):

vec = tf.random_uniform(shape=(3,))
out1 = vec + 1
out2 = vec + 2
print(sess.run(vec))
print(sess.run(vec))
print(sess.run((out1, out2)))
每次调用 run 时,结果都会显示不同的随机值,但在单个 run 期间(out1 和 out2 接收到相同的随机输入值),结果显示的值是一致的:

[ 0.52917576  0.64076328  0.68353939]
[ 0.66192627  0.89126778  0.06254101]
(
  array([ 1.88408756,  1.87149239,  1.84057522], dtype=float32),
  array([ 2.88408756,  2.87149239,  2.84057522], dtype=float32)
)
部分 TensorFlow 函数会返回 tf.Operations,而不是 tf.Tensors。对指令调用 run 的结果是 None。您运行指令是为了产生副作用,而不是为了检索一个值。这方面的例子包括稍后将演示的初始化训练指令。

本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表