zl程序教程

您现在的位置是:首页 >  其他

当前栏目

TensorFlow:实战Google深度学习框架(一)计算、数据、运行模型

Google计算学习框架数据 实战 模型 运行
2023-09-14 09:13:56 时间

第3章 TensorFlow入门

3.1 TensorFlow计算模型——计算图

计算图是TF框架中最基本的概念,所有的计算都会被转化为计算图上的点,下面详细介绍计算图。

3.1.1 计算图的概念

Tensor——张量,可以理解为多维数组;

Flow——流,体现了计算模型,表达了张量之间通过计算相互转化的过程;

每个计算都会被转化为计算图上的一个节点,节点之间的边描述了计算之间的依赖关系

3.1.2 计算图的使用

Tensorflow程序会分为两个阶段:

  • 第一阶段需要定义计算图中的所有计算

  • 第二阶段执行计算

函数效果
tf.get_default_graph获取当前默认的计算图
tf.Graph生成新的计算图
tf.Graph_device指定运算设备

计算图的另一个功能:有效整理TF程序中的资源

通过集合来整合资源:

函数效果
tf.add_to_collection将资源加入一个或多个集合
tf.get_collection获取一个集合中的所有资源

为方便使用,TF也自动管理了一些常用的集合

集合名称集合内容使用场景
tf.GraphKeys.VARIABLES所有变量持久化TensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES可学习的变量模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES日志生成相关张量TensorFlow计算可视化
tf.GraphKeys.QUEUE_RUNNERS处理输入的QueueRunner输入处理
tf.GRaphKeys.MOVING_AVEGAGE_VARIABLES所有计算了滑动平均值的变量计算变量的滑动平均值

3.2 TensorFlow数据模型——张量

张量是TF的数据管理形式

3.2.1 张量的概念

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

张量的实现:并不是直接采用数组的形式,而只是对tensorflow中计算结果的引用。

张量保存的是什么:并不是真正的数字,而是保存如何得到这些数字的计算过程。

张量的属性:名字(name)、维度(shape)、类型(type)

Tensor("MatMul:0", shape=(1, 1), dtype=int32)
  • 名字:张量的唯一标识符,且说明了张量是如何计算出来的; node:src_output的形式
    • node:节点名称
    • src_output:当前张量来自第几个节点的第几个输出(MatMul:0表示计算节点“MatMul的第一个结果”)
  • 维度:描述了张量的维度信息(shape=(1, 1)表示该张量是二维数组)
  • 类型:每个张量会有一个唯一的类型(TF会对所有参与运算的张量进行类型检查,不匹配会报错)

3.2.2 张量的使用

  • 第一类:对中间结果进行引用,当一个计算包含很多中间结果时,使用张量可以提高代码可读性。
a=tf.constant([1.0,2.0],name="a")
b=tf.constant([2.0,3.0],name="b")
result=a+b
  • 第二类:当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字。

虽然张量本身没有存储具体数字,但可以通过会话(session)来得到具体数字

3.3 TensorFlow运行模型——会话

会话(session):执行定义好的运算

会话拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话来回收资源,否则可能出现资源泄露的问题。

会话模式有两种:

  • 第一种模式:需要明确调用会话生成函数和关闭会话函数(当程序异常退出时,关闭会话函数可能不会执行,导致资源泄露)
# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话得到关心的运算结果
sess.run(result)
# 关闭会话
sess.close()
  • 第二种模式:通过Python上下文管理机制
with tf.Session() as sess:
    sess.run(result)
# 当上下文退出时会话关闭,资源可以被释放。

会话如何生成:指定默认会话(默认会话不会自动生成),通过 tf.Tensor.eval 函数计算张量取值。

run和eval的区别:ecal一次只能得到一个节点的值,run可以得到多个节点的值

sess = tf.Session()
with sess.as_default():
    print(result.eval())
[ 4.  6.]

以下代码实现相同的功能:

sess = tf.Session()

# 下面的两个命令有相同的功能
print(sess.run(result))
print(result.eval(session = sess))

使用tf.InteractiveSession()构建会话:

通过默认会话的方式获取张量的取值会更加方便,TensorFlow提供了一种在交互式环境下直接构建默认会话的函数,会自动将生成的会话注册为默认会话。

sess=tf.InteractiveSession()
print(result.eval())
sess.close()

使用ConfigProto Protocol Buffer配置需要生成的会话:

config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)

allow_soft_placement=True 在下面的任意一个条件成立,GPU的运算可以放到CPU上进行:
运算无法在GPU上执行;
没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU);
运算输入包含对CPU计算结果的引用。
log_device_placement=True日志中将会记录每个节点被安排在了哪个设备上以方便调试。