运行 TensorFlow
打开一个 python 终端:
1 $ python 2 >>> import tensorflow as tf 3 >>> hello = tf.constant('Hello, TensorFlow!') 4 >>> sess = tf.Session() 5 >>> print sess.run(hello) 6 Hello, TensorFlow! 7 >>> a = tf.constant(10) 8 >>> b = tf.constant(32) 9 >>> print sess.run(a+b) 10 42 11 >>>
使用 TensorFlow, 你必须明白 TensorFlow:
• 使用图 (graph) 来表示计算任务.
• 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
• 使用 tensor 表示数据.
• 通过 变量 (Variable) 维护状态.
• 使用 feed 和 fetch 为任意操作输入和输出数据.
综述
TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op(operation 的缩写). 一个 op获得 0 个或多个 Tensor , 执行计算, 产生 0 个或多个 Tensor . 每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels] .一个TensorFlow 图 描述 了计算的过程. 为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.
计算图
TensorFlow 程序通常被组织成一个构建阶段, 和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图.在执行阶段, 使用会话执行执行图中的 op.
例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练 op.
TensorFlow 支持 C, C++, Python 编程语言. 目前, TensorFlow 的 Python 库更加易用, 它提供了大量的辅助函数来简化构建图的工作, 这些函数尚未被 C 和 C++ 库支持.
三种语言的会话库 (session libraries) 是一致的.
构建图
构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant) . 源 op 的输出被传递给其它 op 做运算.
Python 库中, op 构造器的返回值代表被构造出的 op 的输出, 这些返回值可以传递给其它 op 构造器作为输入.
TensorFlow Python 库有一个 默认图 (default graph) , op 构造器可以为其增加节点. 这个默认图对 许多程序
来说已经足够用了. 阅读 Graph 类 文档 来了解如何管理多个图.
1 import tensorflow as tf 2 # 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点 3 # 加到默认图中. 4 # 5 # 构造器的返回值代表该常量 op 的返回值. 6 matrix1 = tf.constant([[3., 3.]]) 7 # 创建另外一个常量 op, 产生一个 2x1 矩阵. 8 matrix2 = tf.constant([[2.],[2.]]) 9 # 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入. 10 # 返回值 'product' 代表矩阵乘法的结果. 11 product = tf.matmul(matrix1, matrix2)
默认图现在有三个节点, 两个 constant() op, 和一个 matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的 结果, 你必须在会话里启动这个图.
在一个会话中启动图
构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器
将启动默认图.
欲了解完整的会话 API, 请阅读Session 类.
# 启动默认图. sess = tf.Session() # 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. # 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回 第 1 章 起步 | 21 # 矩阵乘法 op 的输出. # # 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的. # # 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行. # # 返回值 'result' 是一个 numpy `ndarray` 对象. result = sess.run(product) print result # ==> [[ 12.]] # 任务完成, 关闭会话. sess.close()