TF_BASIS_低阶API

前言: 这篇原文是英文的中文翻译文档我给了三星(第一次)和二星(第二次), 但其中的内容, 还是靠谱的(比博文强), 毕竟这是官方的东西了. 下面, 我将个人觉得很释义的几处要点罗列了, 看能否说的明白.

要点0

这个要点其实是我对这篇文档的简要而大纲性的总结, 这个要点有以下几点总结(可以结合下面动图去理解):

  • 默认图: 如果在代码中什么图的声明(如, xx=tf.Grpah())也没有, 而却使用了如tf.Variable这样的涉及到图Graph的操作(TF本身就是一个数据流图的架构, 哪怕你就声明一个常量也涉及到计算图), 那么这时候就用到了默认的计算图;
  • 子图: 当我们计算某个变量的依赖时, 只涉及到一部分而非图中所有的数据依赖, 那么我们可以理解这时候该变量依赖之内的计算图是一个子图;
  • 上下文: 文档中有提到图的上下文(Context), 这个词的用法过于”文学”, 其实在我看资料的逐渐理解中, 觉得这个上下文可以理解成代码中的变量作用域, 当你不在某个上下文中, 你也不在某个作用域中, 是这样吗?! (或: 同一时刻的某个运行环境)

tensors_flowing.gif

Source: tf.g.cn

下面, 开始要点的稍微详细点的说明.

要点1: 图结构和图集合

图结构就如上面动图所演示的那样, 包含图的节点和边缘, 同时也包含了各个操作组合依赖关系的信息.

下面重点理解图集合. 首先, 我们有两个TF函数API: tf.add_to_collectiontf.get_collection, 文档中说它们是tf.Graph中存储元数据集合的通用机制. 然后, 关键来了, 文档中说TF的很多部分都会使用此facility, 如: 在创建 tf.Variable 时, 系统会默认将其添加到表示“全局变量”和“可训练变量”的集合中. 在后续创建 tf.train.Savertf.train.Optimizer 时, 这些集合中的变量将用作默认参数.

这里, 可以联系到默认图, 声明那个变量时(tf.Variable), 那个变量应该添加(tf.add_to_collection)到了默认图中了, 而对默认图进行tf.get_collection操作时, 则获取到了”全局变量”和”可训练变量”. 这一步的解释至关重要, 它说明了简单的变量声明是如何与图联系起来的: 这么看来, 图可以理解成一个collection?! 这一步的解释也说明了tf.train.Saver/Optimizer是如何索取到图的变量并用于它们依赖上的计算的.

总之, 在没有这个解释之前, 真的很难对TF知其所以然.

要点2: 子图

有以下文档中的原文:

tf.Session.run 要求您指定一组 fetch,这些 fetch 可确定返回值,并且可能是 tf.Operationtf.Tensor类张量类型,例如 tf.Variable。这些 fetch 决定了必须执行哪些子图(属于整体 tf.Graph)以生成结果:该子图包含 fetch 列表中指定的所有操作,以及其输出用于计算 fetch 值的所有操作。

看完这段话, 使我给了两星评价. 什么是fetch?! (这文字中时不时穿插一些代码变量, 读着很累) 连官方文档都不翻译中文了, 何解? 这个”fetch”其实就是图中的某个变量吧, 因为图中有很多变量可以单独求解, 我们每次也可以fetch(取)不同的变量来求解, 所以fetch就应该是照着这个意思用上了.

“以下代码段说明了tf.Session.run的不同参数如何导致执行不同的子图”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:
# Run the initializer on `w`.
sess.run(init_op)

# Evaluate `output`. `sess.run(output)` will return a NumPy array containing
# the result of the computation.
print(sess.run(output)) # Fetch了output这个子图;

# Evaluate `y` and `output`. Note that `y` will only be computed once, and its
# result used both to return `y_val` and as an input to the `tf.nn.softmax()`
# op. Both `y_val` and `output_val` will be NumPy arrays.
y_val, output_val = sess.run([y, output]) # Fetch了y和output这两个子图;

要点3: 上下文

tf.Session(上下文, 资源管理(tf.Session拥有物理资源(例如 GPU 和网络连接))), 它运行在默认图中, 就会使用默认图上下文(或, 即, 环境)中的变量等东西.

以下是文档中提及”上下文”的一些语句(并不是全部的”上下文”出处):

  • [REF]: TensorFlow 提供了一个默认图,此图是同一上下文中的所有 API 函数的明确参数。
  • [REF]: 如果您希望 TensorFlow 程序使用多台不同的设备,则可以使用 tf.device 函数轻松地请求将在特定上下文中创建的所有操作放置到同一设备(或同一类型的设备)上。
  • [REF]: 由于 tf.Session 拥有物理资源(例如 GPU 和网络连接),因此通常(在 with 代码块中)用作上下文管理器,并在您退出代码块时自动关闭会话。

以上三处”上下文”, 应该有助于理解”Context”的中文”上下文”的意思了: 第一个“上下文”应该指没有明确声明过tf.Graph的代码段了, 这可以是整个Python文件中的代码(如果此文件从没有声明过tf.Graph的话), 第二个“上下文”应该是指with tf.device("/device:CPU:0"):这个代码块中的语句了, 第三个“上下文”和第二个类似, 同样指with语句块中的语句, 或者这个语句块与别的语句块的上下文关系.

这么看来, 我们说的”上下文”, 是在编程(代码)中, 某处代码位置不同于别处代码位置而造成的语法或语义差别的现象(如一段代码语句在函数中和函数外的差别, 这就是这段代码语句的不同上下文), 这就好比在语文文章中, 不同词句在文章的不同位置有不同的含义一样. 由此, 上下文的用法完成了从语文到编程的转移.

总结

至此, 此篇官方文档中对我来说至关重要的一些概念的总结完成了, 文档中还有别的概念介绍(如: tensorboard等), 也可以一看.

Reference

  1. TensorFlow Learn Guide, 图和会话, [REF].

Drafts Area(M)

以及, 关于张量的官方释义: https://tensorflow.google.cn/guide/tensors;

指南: https://tensorflow.google.cn/guide;