1. 关于TensorFlow
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数组,即张量(tensor)。
2. 什么是数据流图(Data Flow Graph)?
数据流图用“节点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
3. 基本使用
使用 TensorFlow, 你必须明白 TensorFlow:
- 使用图 (graph) 来表示计算任务.
- 在被称之为会话 (Session) 的上下文 (context) 中执行图(具体请查看博文with…as中关于上下文管理协议).
- 使用 tensor 表示数据.
- 通过变量 (Variable) 维护状态.
- 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
3.1 综述
TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].
一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图
必须在会话
里被启动. 会话
将图的op
分发到诸如 CPU 或 GPU 之类的设备上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray
对象。
3.2 计算图
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op
的执行步骤被描述成一个图. 在执行阶段, 使用会话执行执行图中的op
.
例如, 通常在构建阶段创建一个图来表示神经网络, 然后在执行阶段反复执行图中的op
.
3.3 构建图
构建图的第一步, 是创建源 op (source op)
. 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.
TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点. 这个默认图对许多程序来说已经足够用了.
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
默认图现在有三个节点, 两个 constant() op, 和一个matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的结果, 你必须在会话里启动这个图.
3.4 在一个会话中启动图
构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session
对象, 如果无任何参数, 会话构造器将启动默认图.
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回矩阵乘法 op 的输出.
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
# 返回值 'result' 是一个 numpy `ndarray` 对象(也就是张量Tensor).
result = sess.run(product)
print(result)
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()
Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close
外, 也可以使用 with
代码块 来自动完成关闭动作.
with tf.Session() as sess:
result = sess.run(product)
print(result)
3.5 交互式中Session的使用——tf.InteractiveSession
A TensorFlow Session
for use in interactive contexts, such as a shell(在交互式环境如shell
中使用TensorFlowSession
).
The only difference with a regular Session
is that an InteractiveSession
installs itself as the default session on construction. The methods tf.Tensor.eval
and tf.Operation.run
will use that session to run ops(与常规Session
的惟一不同之处是,InteractiveSession
在构建的时候将自己作为默认会话。所以可以通过tf.Tensor.eval
和 tf.Operation.run
方法使用该会话来运行ops).
This is convenient in interactive shells
and IPython notebooks
, as it avoids having to pass an explicit Session object to run ops(这在交互式shell
和IPython笔记本
中很方便,因为它可以避免通过一个显式Session
对象来运行ops).
For example:
sess = tf.InteractiveSession()
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# We can just use 'c.eval()' without passing 'sess'
print(c.eval()) # 30.0
sess.close()
Note that a regular session installs itself as the default session when it is created in a with
statement. The common usage in non-interactive programs is to follow that pattern(注意,当在一个with
语句中创建一个常规会话时,它也将自己作为默认会话。所以在非交互式程序的常见用法是):
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
with tf.Session():
# We can also use 'c.eval()' here.
print(c.eval())