参考书籍《Tensorflow实战Google深度学习框架》郑泽宇等
Tensorflow是一款谷歌开源的深度学习工具,与其他深度学习工具(比如caffe、Deeplearning4j等)相比,其受关注度和欢迎程度尤为突出。在谷歌内部,Tensorflow已经广泛用于语音搜索、广告、电商、图片、街景图、翻译、Youtube等众多产品中。
Tensorflow计算模型—计算图
Tensorflow中一个重要的概念就是计算图,tensorflow中所有计算都会转化为计算图中的节点,而节点之间的边描述了计算之间的依赖关系。下图中的节点add代表一个加法计算,a和b两个常量不依赖于其他任何计算。add计算依赖读取两个常量的取值,图中可以看到有一条从a到add的有向边和从b到add的有向边。图中没有任何计算依赖于add的结果,所以节点add没有任何指向其他节点的边。Tensorflow中所有程序都可以通过类似的计算图的形式来表示,也是软件的基本计算模型。
Tensorflow的程度一般分为两个阶段。第一个阶段定义计算图中所有的计算,第二个阶段为执行计算。在下面计算过程中,Tensorflow会自动将定义的计算转化为计算图上的节点。在tensorflow中,系统会自动维护一个默认的德计算图。注意,tensorflow中变量存取的不是值,而是取值的计算过程。
import tensorflow as tf #替换模块名称,使程序更简洁
a=tf.constant([1.0, 2.0], name="a")
b=tf.constant([2.0, 3.0], name="b")
result=a+b
print(a.graph is tf.get_default_graph())
print(result)
当然,除了使用默认的计算图,也可以通过tf.Graph函数来生成新的计算图,这样可使不同计算图上的张量和运算不会共享。
Tensorflow数据模型—张量
Tensorflow中,所有的数据都通过张量形式来表示。从功能角度上将,张量可被简单理解为多维数组,零阶张量为标量,表示一个数;一阶张量为一个一维数组;第n阶张量可理解为一个n维数组。与数组不同的是,数组一般存储的是计算的结果,而张量存储的是运算结果的引用,即张量保存的是如何得到结果的计算过程。上文中代码result输出是一个张量(包含名字、维度和类型),如下所示:
Tensor("add_4:0", shape=(2,), dtype=float32)
张量的第一个属性名字不仅是张量的唯一标识符,同时还给出这个张量是如何计算出来的。”add_4”表示计算图中节点的名称,而冒号后面的”0”表示当前张量来自该节点第一个输出(编号从0开始)。
张量的第二个属性是维度shape,描述张量的维度信息。Shape=(2,)表示张量为一个一维数组,数组长度为2。
张量的第三个属性是类型,每个张量都有一个唯一的类型。Tensorflow会对参与运算的所有张量进行类型的检查,当发现类型不匹配时会报错。
张量的使用大致可分为两类:第一类,张量用于对中间计算结果的引用;第二类,张量用于获取最终的计算结果。
Tensorflow运行模型—会话
前面介绍了tensorflow的计算模型和数据存储,本节将介绍tensorflow如何将利用会话(session)模型来执行定义好的运算。会话拥有并管理tensorflow程序运行时的所有资源。注意当计算完成后需要关闭会话来完成资源回收,否则会造成资源泄漏。
Tensorflow中会话模式一般有两种,第一种模式需要明确调用会话生成函数和关闭会话函数,示例代码如下。此种模式有一个问题,当程序因为异常退出时,关闭会话的函数不会执行,从而导致资源泄漏。
import tensorflow as tf
a=tf.constant([1.0, 2.0], name="a")
b=tf.constant([2.0, 3.0], name="b")
result=a+b
sess=tf.Session()
sess.run(result)
sess.close()
为了解决这个问题,tensorflow可通过python上下文管理器来使用会话,此为会话的第二种模式。上下文管理机制,只需要将所有的计算放在with内部即可。当程序计算异常退出时,必然会退出上下文管理机制,那么就会释放所有的资源,不会造成资源泄漏。
import tensorflow as tf
a=tf.constant([1.0, 2.0], name="a")
b=tf.constant([2.0, 3.0], name="b")
result=a+b
with tf.Session() as sess:
sess.run(result)