Tensorflow计算、数据和运行模型

来源:互联网 发布:程序化交易策略源码 编辑:程序博客网 时间:2024/06/05 05:00

参考书籍《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+bprint(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 tfa=tf.constant([1.0, 2.0], name="a")b=tf.constant([2.0, 3.0], name="b")result=a+bsess=tf.Session()sess.run(result)sess.close()

为了解决这个问题,tensorflow可通过python上下文管理器来使用会话,此为会话的第二种模式。上下文管理机制,只需要将所有的计算放在with内部即可。当程序计算异常退出时,必然会退出上下文管理机制,那么就会释放所有的资源,不会造成资源泄漏。

import tensorflow as tfa=tf.constant([1.0, 2.0], name="a")b=tf.constant([2.0, 3.0], name="b")result=a+bwith tf.Session() as sess:  sess.run(result)





原创粉丝点击