TensorFlow深度学习框架学习笔记(1)

TensorFlow的计算模型、数据模型和运行模型

TensorFlow计算模型——计算图

计算图是TensorFlow中最基本的概念,TensorFlow中的所有计算都会被转化为计算图上的节点。
Tensor就是张量。张量在这里可以简单地理解为多维数组(后续会有详细的解释)。Flow,顾名思义,就是“流”的 意思。TensorFolw是一个通过计算图的形式来表述计算的编程系统。
计算图:
节点——TensorFlow中的每个计算
边——计算间的依赖关系

计算图的使用

TensorFlow程序一般可以分为两个阶段。其一,定义计算图中所有计算;其二,执行计算。
在Python中一般会采用“import tensorflow as tf”的形式来载入TensorFolw。在这个过程中,TensorFolw会自动维护一个默认的计算图,可以通过tf.get_default_graph来调取当前默认的计算图。(注:TensorFlow中没有常量,而是作为一种永远输出固定值的运算)

计算图的作用:
可以用来隔离张量和计算;
提供了管理张量和计算的机制;
有效地整理TensorFlow程序中的资源。

TensorFlow数据模型——张量

张量是TensorFlow管理数据的形式。

张量:
零阶张量:标量,也就是一个数;
一阶张量:向量;
n阶张量:n维数组。

张量中主要保存了三个属性:名字(name)、维度(shape)、类型(type)。
名字是一个张量的唯一标识符,它同样也给出了这个张量是如何计算出来的。张量的名字是通过“node:src_output”,node为节点的名称,src_output表示当前张量来自节点的第几个输出。
维度,这个属性描述了一个张量的维度信息。
类型,每一个张量会有一个唯一的类型。(参与运算的张量类型不匹配时会报错)

TensorFlow支持的14种不同的类型:实数(float32、float64)、整数(int8、int16、int32、int64、uint8)、布尔型(bool)、复数(complex64、complex128)。

张量的使用

对中间计算的引用;
获得计算结果,得到真实数字。

TensorFlow运行模型——会话
会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。
TensorFlow中使用会话的模式:
其一,需要明确调用会话生成函数和关闭会话函数;

sess = tf.Session()

sess.run(……)

sess.close()
其二,TensorFlow可以通过Python的上下文管理器来使用会话。(要将所有的计算放在with的内部)

with tf.Session() as sess:
    sess.run(……)
#不需要再调用Session.close()函数来关闭对话
#当上下文推出时会话关闭和资源释放也自动完成了
类似于计算图,TensorFlow也有类似默认会话的机制,但TensorFlow不会自动生成默认的会话,而是需要手动设置。在默认会话被指定后可以通过tf.Tensor.eval函数来计算一个张量的取值。

seee = tf.Session()
with sess.as_default():
    print(result.eval())
TensorFlow提供了一种在交互式环境下直接构建默认会话的函数。tf.InteractiveSession,使用这个函数会将自动生成的会话注册为默认会话。

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

无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。下面给出了通过ConfigProto配置会话的方法:
config = tf.ConfigProto(allow_soft_placement = True, log_device_placement = True)
sess1 = tf.InteractivesSession(config = config)
sess2 = tf.Session(config = config)

通过ConfigProto可以配置的参数有:并行线程数、GPU分配策略、运算超时时间等。其中常用的参数有两个:
第一个是allow_soft_placement,布尔型。改参数默认值为False,但是有时为了使得代码的可移植性更强,在有在GPU的环境下,一般可以设置为True。其取值为True时,以下任一条件成立时,GPU上的运算可以放到CPU上进行:
1.运算无法在GPU上执行;
2.没有GPU资源(例如,运算被指定在第二个GPU上运行,但是机器只有一个GPU);
3.运算输入包含对CPU计算结果的引用。

第二个是log_device_placement,布尔型。当其取值为True时,日志中会记录每个节点被安排在了哪个设备上,以便于调试。(在实际生产环境中,将这个参数设置为False可以减少日志量。)

你可能感兴趣的:(学习笔记)