综述
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 实例.
基本概念:
- 使用图 (graph) 来表示计算任务.
- 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
- 使用 tensor 表示数据.
- 通过 变量 (Variable) 维护状态.
- 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
图与会话
创建图,执行会话
以下代码创建了图:
import tensorflow as tf
x = tf.Variable(5, name='x')
y = tf.Variable(2, name='y')
f = x*x*y + y + 10
上边的代码创建了计算图,但是 没有 执行计算。计算这个图,需要打开一个 TensorFlow Session ,然后使用它来初始化变量以及计算 f:
sess = tf.Session()
sess.run(x.initializer)
sess.run(y.initializer)
print(sess.run(f))
sess.close()
如果变量很多,会使得 sess.run()
多次出现。所以,我们使用 with
块来设置默认session:
with tf.Session() as sess:
x.initializer.run() # equivalent to tf.get_default_session().run(x.initializer)
y.initializer.run()
retsult = f.eval() # equivalent to calling tf.get_default_session().run(f)
print(retsult)
sess.close()
上边的代码手动去初始化了各个变量。我们也可以使用 global_variables_initializer()
来初始化所有变量(不会立即执行初始化):
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
retsult = f.eval()
print(retsult)
sess.close()
管理图
上边的代码都是使用默认图,如果需要在独立的图里边执行代码,可以自行创建图:
import tensorflow as tf
x1 = tf.Variable(1)
print(x1.graph is tf.get_default_graph()) # True
graph = tf.Graph() # 独立的 Graph
with graph.as_default():
x2 = tf.Variable(2)
print(x2.graph is tf.get_default_graph()) # False
Node 的存活周期
变量的存活开始于其初始化,结束于会话结束:
import tensorflow as tf
w = tf.constant(3)
x = w + 2
y = x + 3
z = x + 4
# 计算 w 、 x 两次
with tf.Session() as sess:
print(y.eval())
print(z.eval())
sess.close()
# 计算 w 、 x 一次
with tf.Session() as sess:
y_eval, z_eval = sess.run([y, z])
print(y_eval)
print(z_eval)
sess.close()
示例:使用TensorFlow实现线性回归
θ 等式计算
线性回归的计算我们使用: