TensorFlow 从入门到精通(七):TensorFlow 运行原理
通过几个例程,我们逐渐对 TensorFlow 建立了感性认识。本文将进一步从内在原理进行深入理解,进而为阅读源码打好基础。
1. 图(Graph)
TensorFlow 计算被抽象为包括若干节点的有向图。如下图所示例子:
对应的 TensorFlow Python 代码如下:
import tensorflow as tf
b = tf.Variable(tf.zeros([100])) # 100-d vector, init to zeroes
W = tf.Variable(tf.random_uniform([784,100],-1,1)) # 784x100 matrix w/rnd vals
x = tf.placeholder(name="x")
relu = tf.nn.relu(tf.matmul(W, x) + b)
C = [...]
s = tf.Session()
for step in xrange(0, 10):
input = ...construct 100-D input array ...
result = s.run(C, feed_dict={x: input})
print step, result
在 TensorFlow 有向图中,每个节点表示运算符,可以有零个或多个输入,零个或多个输出。
在有向图的普通棱边(从一个节点输出到另一个节点输入)流动的数值称为张量(Tensor),本质为任意维度数组。张量的元素数据类型可以显式指定或在构建有向图时推断得到。
有关图及张量的实现源码均位于 tensorflow/tensorflow/python/framework/ops.py,我们后面会细讲。
2. 运算符(Operations)与核函数(Kernels)
TensorFlow 支持多种常用运算符,如矩阵乘、加法。
核函数是运算符的特定实现,可以运行在特定类型设备上(如 CPU 或 GPU )。
TensorFlow 通过注册机制来确定支持的运算符集合和核函数,方便进一步扩展。
表1 展示了 TensorFlow 内置的一些运算符种类:
运算符相关的代码位于:tensorflow/tensorflow/python/ops/ 目录下。以数学运算符为例,代码为上述目录下的 math_ops.py,间接地调用了 gen_math_ops.py,又调用了 tensorflow/tensorflow/core/kernels/ 下面的核函数实现。这些我们会在后面细讲。
3. 会话(Sessions)
客户端程序通过创建会话同 TensorFlow 系统交互。
为了创建一个计算图,会话接口支持扩展方法来补充当前图。
Run 接口允许指定将某个张量 Tensor 作为入口参数馈入计算图,得到一组计算输出。
会话相关源码位于 tensorflow/tensorflow/python/client/session.py,具体我们会在后面细讲。
4. 变量(Variables)
大多数计算中,有向图会执行多次。
大多数张量生命周期都不会超过有向图的一次执行。
变量是特殊运算,返回一个持续可更改的张量句柄,生命周期横亘有向图的多次执行。
变量句柄可以传递给大量特殊操作,如 Assign(=),AssignAdd(+=)。
对于机器学习应用,模型权值一般都会存放在变量中,更新操作会作为训练有向图 Run 的一部分。
变量相关源码位于 tensorflow/tensorflow/python/ops/variables.py,是一类特殊的运算。后面我们会细讲。
更多推荐
所有评论(0)