tensorflow实战

一、Tensorflow计算模型——计算图

计算图是Tensorflow中最基本的一个概念。Tensorflow中所有计算都会被转化为计算图上的结点。

1.1计算图概念

Tensorflow——可以拆分为:tensor与flow。

tensor(张量):可以简单理解为多维数组

flow(流):表达了张量之间通过计算相互转化的过程。

Tensorflow实际上是一个计算图的形式来表达计算的编程系统。Tensorflow中的每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。

图源自书

例图:图中的每一个节点都是一个运算,而每一条边代表了计算之间的依赖关系,如果一个运算依赖于另一个运算的输出,即可说明两个运算有依赖关系。

1.2计算图的使用

代码:

代码说明:

以上代码产生了两个计算图,每个计算图定义了一个名为"v"的变量,在计算图1中被初始化为0,在计算图2中被初始化为1.因此可以看到在运行不同计算图时,张量v的值也是不一样的。Tensorflow中的计算图不仅可以隔离张量计算,还提供了管理张量和计算的机制,计算图可以通过tf.Graph.device函数来指定运算计算上的设别,这为Tensorflow使用GPU提供了机制。

二、Tensorflow数据类型——张量

张量时Tensorflow管理数据的形式。

2.1张量的概念

在Tensorflow程序中,所有的数据都是通过张量的形式表示。从功能的角度上看,张量可以被简单理解为多维数组。其中0阶张量表示标量(即一个数),一阶张量为向量,也就是一个一维数组;第n阶张量可以理解为一个n维数组。

但在Tensorflow中,张量的表现并不是直接采用数组的形式,它只是对Tensorflow中运算结果的引用。在张量中并没有真正保存数字,保存的是如何得到这些数字的计算过程。

例如:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = tf.add(a, b, name="add")
print(result)

输出:

Tensor("add_2:0", shape=(2,), dtype=float32)

分析:Tensorflow计算结果不是一个具体的数字,而是一个张量的结构。张量中保存了三个属性:名字(name)、维度(shape)、类型(type)。

  • name:张量的唯一标识符,给出了这个张量是如何计算出来的。(联系上一节讲到的图)计算图中每一个节点代表了一个计算,计算的结果保存在张量中,所以张量和计算图上的所代表的计算结果是一一对应的,张量的命名通过:node:src_output的式给出。其中node是节点的名称,src_output表示当前张量来自节点的第几个输出。例如上例中的"add:0"则表示张量来自add节点的第一个输出。
  • shape:数据的维度信息,(2,)表示的该张量result是一个一维数组,长度为2
  • type:张量的数据类型(注:不同数据类型进行计算时会报错,例如float64和int32计算时会报错)

2.2 张量的使用

优点:

第一类:

  • 通过张量来引用计算的中间结果可以使代码的可阅读性大大提升
  • 通过张量来存储中间结果可以方便获取中间结果。

第二类:

  • 当计算图构造完成之后,张量可以用来获取结果(即真实的数字)

2.3 会话(session)

会话用于哦并管理Tensorflow程序运行时的所有资源。所有计算万层之后便会需要关闭会话来帮助系统回收资源,否则会出现资源泄露的问题。

Tensorflow中使用的会话模式一般有两种,第一种使需要明确调用会话生成函数和关闭会话函数,其代码流程如下:

# 创建一个会话。
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算结果。比如:sess.run(result)--(存疑,因为我自己调用没有得到任何结果)
sess.close()

一般使用这种模式时,在所有计算完成之后,需要明确调用Session.close()函数来关闭会话释放资源。

另外一种——使用python的上下文管理器的机制,将所有的计算放在"with"的内部即可。当上下文管理器退出时会自动释放所有资源,这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用Session.close()函数而产生的资源泄露。

待更新…

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐