TensorFlow基本使用
2018-10-14 本文已影响0人
Simple_isBeauty
一、TensorFlow计算模型——计算图
- TensorFlow中的所有计算都会被转化为计算图上的节点
计算图的概念
- Tensor就是 张量,可以理解为多维数组,表明了它的数据结构,Flow则体现了它的计算模型, Flow是“流”的意思,表达了张量之间通过计算相互转化的过程。TensorFlow是一个通过计算图的形式来表述计算的编程系统,TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
- 为建模方便,TensorFlow会将常量转化成一种用永远输出固定值的运算
计算图的使用
- TensorFlow程序可以分为两个阶段。第一个阶段定义计算图中的所有计算,例如定义加法计算a、b的和
import tensorflow as tf
a = tf.constant([1.0, 2,0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b
- 在这个过程中,TensorFlow会自动将定义的计算转化为计算图上的节点,在TensorFlow程序中,系统会维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图,以下展示如何获取默认计算图以及如何查看一个运算所属计算图
print(a.graph is tf.get_default_graph())
- 除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享,一下生成了一个新的计算图
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
#在计算图g1中定义变量“v”,并设置初始值为0
v = tf.grt_variable(
"v", initializeer=tf.zeros_initializeer(shape=[1]))
#在计算图g1中读取变量“v”的取值
with tf.Session(graph=g1) as sess:
tf.initialize_all_variables().run()
with tf.variable_scopr("", reuse=True):
#在计算图g1中,变量v取值0,所以下面这行输出[0.]
print(sess.run(tf.get_variable("V")))
- TensorFlow中的计算图不仅仅可以用来隔离张量和计算,还提供了管理张量和计算的机制,下面的程序可以将加法计算跑在GPU上
g = tf.Graph()
with g.device('/gpu:0'):
result = a + b
二、TensofFlow数据模型——张量
- 张量是TensorFlow管理数据的形式
张量的概念
- TensorFlow程序中,所有的数据都通过张量的形式来表示,功能上,张量可以被简单理解为多维数组,但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。张量保存的是如何得到这些数字的计算过程。如下,并不会得到加法的结果,而会得到对结果的一个引用
import tensorflow as tf
# tf.constant 是一个计算,这个计算的结果为一个张量,保存在变量a中
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b
print result
···
输出:
Tensor("add:0", shape=(2, ), dtype=float32)
···
- TensorFlow中的计算结果为一个张量,并不是一个具体的数字,而是一个张量的结构。一个张量中主要保存了三个属性:名字(name)、维度(shape)和类型(type)
- 张量的第一个属性名字不仅是一个张量的唯一标识符,同样也给出了这个张量是如何计算出来的。计算图上的每一个节点代表了一个计算,计算的结果就保存在张量中。所以张量和计算图上的节点多代表的计算结果是对应的。这样张量的命名就可以通过“node:src_output”的形式来给出。其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。“add:0”说明result这个张量是计算节点“add”输出的额第一个结果(编号从0开始)
- 张量的第二个属性是张量的维度
- 张量的第三个属性是张量了欸行,每一个张量会有一个唯一的类型,不指定了类型,会给出默认类型,不带小数点会被默认int32,带小数点会默认为float32.一般建议制指定dtype类型
张量的使用
- 第一类用途是对中间计算结果的引用
#使用张量记录中间结果
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
reslut = a + b
#直接计算向量的和,可读性差,无法查看中间状态
result = a = tf.constant([1.0, 2.0], name="a") + tf.constant([2.0, 3.0], name="b")
- 第二类是当计算图构造完成后,张量可以用来获得计算结果(通过会话取得),例如tf.Session().run(result)语句来得到结果
三、TensorFlow运行模型——会话
- TensorFlow会话(session)来执行定义好的运算,会话拥有并管理TensorFlow运行时的所有资源,当所有计算完成后需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的问题。以下为两种模式
#创建一个会话
sess = session()
#使用这个会话得到运算结果
sess.run(...)
#关闭会话使得本次运行中的资源得到释放
sess.close()
#创建一个会话,通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
#使用这个会话来计算关系的结果
sess.sun(...)
#不需要在调用“Session.close()”函数来关闭会话
#当上下文退出时会话关闭和资源释放也自动完成了
- TensorFlow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入这个计算图中,TensorFlow中的会话也有类似的机制,但TensorFlow不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后,可以通过tf.Tensor.eval函数来计算一个张量的取值。
sess = tf.Session()
with sess.as_default():
print(result.eval())
以下代码也可以完成相同的功能
sess = tf.Session()
#下面两个命令有相同的功能
print(sess.run(result))
print(result.eval(session=sess))
- 在交互环境下(Python脚本或者Jupyter),通过设置默认会话的方式来获取张量的取值会更加方便。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.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
- 通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。