本篇介绍TensorFlow基本概念。前三节分别介绍TensorFlow的计算模型、数据模型和运行模型。最后一节,简单介绍了神经网络的主要计算流程,以及如何通过TensorFlow实现这些计算。
1 TensorFlow计算模型---计算图
计算图是TensorFlow中最基本的一个概念,TensorFlow中的所有计算都会被转化为计算图上的节点。两节点之间的边描述了计算之间的依赖关系。
TensorFlow程序分两个阶段:定义计算图中所有的计算、执行计算。
TensorFlow会自动将定义的计算转化为计算图上的节点。程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。
如:print(a.graph is tf.get_default_graph())。
除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图,不同计算图上的张量和运算都不会共享。
如:import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
...
g2 = tf.Graph()
with g2.as_default():
...
TensorFlow中的计算图不仅可以用来隔离张量和计算,还提供了管理张量和计算的机制。计算图可以通过tf.Graph.device函数指定运行计算的设备。这为TensorFlow使用GPU提供了机制。
如:g = tf.Graph()
with g.device('/gpu:0'):
result = a + b
有效地整理TensorFlow程序中的资源也是计算图的一个重要功能。在一个计算图中,可通过集合管理不同类别的资源。如通过tf.add_to_collection函数可将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行TensorFlow程序所需要的队列资源。
2 TensorFlow数据模型---张量
张量是TensorFlow管理数据的形式,所有的数据都通过张量的形式来标示。从功能的角度上,张量可被简单理解为多维数组。其中零阶张量表示标量,也就是一个数;第一阶张量为向量,即一维数组。n阶张量可理解为一个n维数组。但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,保存的是如何得到这些数字的计算过程。
如:...
result = tf.add(a,b,name='add')
print(result)
...
输出:
Tensor("add:0",shape=(2,),dtype=float32)
一个张量中主要保存了三个属性:名字、维度和类型。
张量使用主要可以分为两大类:
1、第一个用途是对中间计算结果的引用;
2、当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字(通过会话session)。
3 TensorFlow运行模型---会话
会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来回收资源,以免资源泄漏。TensorFlow中使用会话的模式有两种:明确调用会话生成函数和关闭会话函数、通过Python的上下文管理器来使用会话。
如:
with tf.Session() as sess:
sess.run(...)
通过Python上下文管理器机制,只要将所有的计算放在“with”内部即可。当上下文管理器退出时候会自动释放所有资源。
在交互式环境下(比如Python脚本或者Jupyter的编辑器下),通过设置默认会话的方式来获取张量的取值更加方便。TensorFlow提供了在交互式环境下直接构建默认会话的函数:tf.InteractiveSession。使用此函数会自动将生成的会话注册为默认会话。
如: sess = tf.InteractiveSession()
print(result.eval())
sess.close()
通过tf.InteractiveSession函数可以省去将生成的会话注册为默认会话的过程。无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。
如:
config = tf.ConfigProto(allow_soft_placement=True)
sess1 = tf.IntreactiveSession(config=config)
sess2 = tf.Session(config=config)
通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。