Tensor + Flow = TensorFlow
本章介绍TensorFlow的基础。特别地,你将学习如何用TensorFlow进行基础计算。在开始使用 TensorFlow之前,你必须理解它背后的哲学。 这个库基于计算图的概念,如果你不理解计算图是如何工作的,你就不能理解如何使用这个库。我将快速的介绍计算图并告诉你如何用 TensorFlow进行简单的计算。你将明白这个库是如何工作的,并明白如何使用它。
本章的大部分介绍tensors的概念,并讨论tensors在TensorFlow里是如何表示和操作的。这些讨论有必要简单的回顾一下作为张量计算基础的数学概念。 特别地,我们简单的回顾线性代数并说明如何用TensorFlow进行基础的线性代数计算。接着我们讨论声明式和命令式编程风格的不同。不像许多编程语言, TensorFlow大部分是声明式的。调用TensorFlow的计算添加计算描述到 TensorFlow的“计算图”。特别地, TensorFlow代码 “描述”计算但并不进行实际计算。 在TensorFlow v1里要运行计算,我们需要创建 tf.Session对像。虽然TensorFlow v2不用sessions对象,但是也有必要介绍sessions的概念并描述如何在TensorFlow里用它们进行计算。我们将简单的比较TensorFlow v1和TensorFlow v2的区别。我们还讨论变量的标记。TensorFlow里的Variables存贮张量并允许有状态的计算以修改变量。我们说明如何创建变量并通过TensorFlow更新变量。
1.理解计算图
要理解TensorFlow如何工作,你必须理解什么是计算图。计算图是个图,里面的节点相当于一个操作或变量。 变量可以将值输入到操作,一个操作可以将结果输入到另一个操作。通常,节点是圆 (或椭圆),里面是变量的名或操作, 当一个节点值输入到另一个节点时,用箭头从一个节点连到另一个节点。最简单的图是里面只有一个变量的图 (记住节点可以是变量或操作)。图 2-1 简单的计算变量 x的值。
图 2-1. 我们可以构建的最简单的图,显示为一个简单的变量
这不是很有趣!我们考虑一下略为复杂一点的情况,例如一个变量x 和 y的和: z = x + y。可以用下面的图表示 (图2-2):
图2-2. 两个变量之和的基本的计算图
图2-2左边是变量 (节点里是 x和 y),而更大的节点表示两个变量的和。箭头表示两个变量输入到第三个节点。图应按拓扑顺序读取,意味着你要按箭头的顺序计算节点。箭头也告诉你节点的依赖关系。要评估z, 你首先必须评估 x和 y。我们也可以说进行求和的节点依赖于输入节点。
要理解的一个重要方面是这种图只定义一个操作 (本例是求和)从两个输入 (本例是 x 和y) 得到结果 (本例是 z)。这基本上定义为 “求和”。你必须给输入x和 y赋值然后才能求和得到z。只有你评估了所有的节点图才会给你结果。
注意,定义每一个节点称为图的“构建”,而评估相关操作的真实值称为 “evaluation”。
这是要理解的很重要的方面。注意输入变量不一定是实数,它们可以是矩阵,向量,等。 (在神经网络的相关计算里几乎都是使用矩阵。)略为复杂的情况见图 2-3它用图来计算量 A(x + y), 有三个图入量: x, y, 和A。
图 2-3. 计算量 A(x + y)的计算图, 给出三个输入量: x, y, A
我们可以通过给输入节点(本例是 x, y,和 A)赋值来评估这个图。例如,如果你考虑图2-3中的图并赋值 x = 1, y = 3, 和A = 5, 我们得到结果 b = 20
(绘制为图2-4).
图2-4. 要评估图2-3中的图,我们必须给输入节点 x, y,和 A 赋值然后通过图评估节点
神经网络本质上是非常复杂的计算图,每一个神经元包含多个节点将它的输出输入到另外的神经元,直到得到一定的输出。后面我们将构建最简单的神经网络:只有一个神经元。即便是这么简单的神经网络,我们也要很多的工作。
通过将构建与评估分开,TensorFlow允许你轻松的构建非常复杂的计算图。 (记住,要计算结果,你必须赋值并评估所有的节点)。后面我告诉你这是如何工作的:如何构建计算图,如何评估它们。
注意 记住tensorflow首先构建计算图(称为构建阶段)但是不会评估它。这个库保持两步分开,所以你可以用不同的输入进行多次计算。