1 计算图——计算模型
TensorFlow程序中的计算过程可以表示为一个计算图,也称一个有向图。
张量就是在边中流动的数据,其数据类型可以在编程时事先定义,也可以根据计算图的上下文理解推断出来。
计算图有将计算过程可视化的作用。
import tensorflow as tf
# 系统自动维护一个默认的计算图,并自动将定义的所有计算添加到默认的计算图
a = tf.constant([1.0, 2.0], name="a") # 常量
b = tf.constant([3.0, 4.0], name="b")
result = a+b
# graph属性获取张量所属的计算图
print(a.graph is tf.get_default_graph()) # True
# 创建一个计算图
g1 = tf.Graph()
with g1.as_default(): # 将定义的计算图设置为默认
# 创建图中的变量并设置初始值
a = tf.get_variable("a", [2], initializer=tf.zeros_initializer())
b = tf.get_variable("b", [2], initializer=tf.ones_initializer())
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run() # 初始化计算图中的所有变量
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("a"))) # [0. 0.]
print(sess.run(tf.get_variable("b"))) # [1. 1.]
方法:
- graph属性获取张量所属的计算图。
- get_default_graph()方法获取对当前默认计算图的引用。
- Graph()函数生成计算图。
- as_defalut()函数将生成的计算图指定为默认。
- variable_scope()函数控制变量空间。
- add_to_collection()函数可以将个体加入一个或多个集合中
- get_collection()函数用来获取一个集合中的所有个体。
不同计算图上的张量和运算都不会共享,即不能在某一计算图上调用其它计算图的成员。
2 张量——数据模型
张量是TensorFlow管理数据的形式,所有的数据都可以借助张量的形式来表示。
import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a") # 常量
b = tf.constant([3.0, 4.0], name="b")
result = a+b
print(result) # Tensor("add:0", shape=(2,), dtype=float32)
with tf.Session() as sess:
tf.initialize_all_variables().run()
print(sess.run(result)) # [4. 6.]
张量保存的是运算结果的属性(操作op,维度shape,数据结构dtype)。
- 操作的命名是"node:src_output"形式,“结点名称:这个张量是节点的第几个输出(编号从0开始)”。
- 维度可以用resize_image()和reshape()函数修改。
- 数据类型不匹配不能参与运算。可以用dtype参数直接指定其数据类型。
3 会话——运行模型
会话管理着程序运行时的所有资源。在所有的计算完成之后,通常需要关闭会话以帮助系统回收资源;否则很有可能会导致资源泄露的问题。
Session是用户使用TensorFlow时的交互式接口,被实现为Session类。提供,run()方法执行图,extend()方法为计算图添加新的结点和边。close()函数关闭会话释放资源。
在定义计算时TensorFlow会自动生成一个默认的计算图,但不会自动生成默认的会话。将一个会话指定为默认会话sess.as_result()
。
TensorFlow提供了一个直接构建默认会话的类InteractiveSession类。使用这个类sess=tf.InteractiveSession()
可以省略通过as_result()函数注册为默认会话的过程。
当默认会话被指定之后可以通过Tensor.eval()函数来计算一个张量的取值。
对于一个张量t,使用t.eval()
等价tf.get_default_session.run(t)
。不过,run函数一次可以传入多个需要计算的张量,eval函数只能计算一个张量调用一次。
3.1 Session的参数配置
import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
with tf.Session() as sess:
print(a.eval()) # [1. 2.]
# 设置config参数来配置会话的默认选项
config = tf.ConfigProto(log_device_placement=True, allow_soft_placement=True)
# 用于创建默认会话
sess1 = tf.InteractiveSession(config=config)
使用ConfigProto()函数配置Session:
- log_device_placement参数:布尔型,为True时,日志中将会记录运行每个节点所在的计算设备并打印出来。
- allow_soft_placement参数:布尔型,为True时,当运算无法在GPU-图像处理单元上执行的时候回将运算转移到CPU上执行。
3.2 placeholder机制
TensorFlow提供了placeholder机制,用于在会话运行时动态提供输入数据。placeholder相当于定义了一个位置,这个位置上的数据在程序运行时再指定。目的是为了解决如何在有限的输入节点上实现高效地接收大量数据的问题。
import tensorflow as tf
# 定义一个位置(dtype, shape, name)
a = tf.placeholder(tf.float32, shape=(2), name="input")
b = tf.placeholder(tf.float32, shape=(4,2), name="input")
result = a+b
with tf.Session() as sess:
print(sess.run(result, feed_dict={a:[1.0,2.0],
b:[[2.0,4.0],[5.0,6.0],[7.0,8.0],[9.0,10.0]]}))
print(result) # Tensor("add:0", shape=(4, 2), dtype=float32)
- 定义placeholder(dtype,shape,name)时,数据类型dtype必须指定,且类型不可改变。维度shape不一定给出,不确定的可以填入None。
- Session.run()函数的feed_dict参数是一个字典,在字典中需要给出每个用到的placeholder取值。