tensorflow中计算图的概念
tensorflow程序一般分为两个阶段:
1、定义计算图所有的计算
2、在session中执行计算
在tensorflow程序中,系统会自动维护一个默认的计算图,可以通过tf.get_default_graph()函数获取。以下代码展示了如何获取
默认计算图以及如何查看一个运算所属的计算图:
import tensorflow as tf a=tf.constant([1.0,2.0], name='a') # 定义一个常量使用tf.constant方法b=tf.constant([1.0,2.0], name='b') result = a+b # 通过a.graph可以查看张量所属的计算图,如果没有特别指定,则属于当前默认的计算图print(a.graph is tf.get_default_graph()) # 输出为True
tensorflow可以通过tf.Graph函数生成新的计算图。不同计算图上的张量和运算都不会共享
g1=tf.Graph()with g1.as_default(): # 在计算图g1中定义变量'v',并设置初始值为0。 v=tf.get_variable('v',initializer=tf.zeros_initializer()(shape = [1])) g2=tf.Graph()with g2.as_default(): # 在计算图g2中定义变量'v',并设置初始值微1。 v=tf.get_variable('v',initializer=tf.ones_initializer()(shape = [1]))# 在计算图g1中读取变量'v'的取值with tf.Session(graph=g1) as sess: tf.global_variables_initializer().run() with tf.variable_scope('',reuse=True): # 在计算图g1中,变量'v'的取值应该为0,下一行代码会输出[0.]。 print(sess.run(tf.get_variable('v')))# 在计算图g2中读取变量'v'的取值with tf.Session(graph=g2) as sess: tf.global_variables_initializer().run() with tf.variable_scope('',reuse=True): # 在计算图g2中,变量'v'的取值应该为1,下一行代码会输出[1.]。 print(sess.run(tf.get_variable('v')))
tensorflow中的计算图不仅可以用来隔离张量和计算,它还提供了管理张量和计算的机制。计算图可以通过tf.Graph.device函数来指定运行计算的设备,下面代码指定在GPU上运行加法计算:
g=tf.Graph()# 指定计算运行的设备。with g.device('/gpu:0'): result=a+b
在一个计算图中,可以通过集合(collection)来管理不同类别的资源。比如通过tf.add_to_collection函数可以将资源加入到一个或多个集合中,然后通过tf.get_collection获取集合里的资源。
tensorflow中自动管理了一些常用的集合,如下表:
集合名称 | 集合内容 | 使用场景 |
tf.GraphKeys.VARIABLES | 所有变量 | 持久化tensorflow模型 |
tf.GraphKeys.TRAINABLE_VARIABLES | 可学习的变量(一般指神经网络中的参数) | 模型训练、生成模型可视化内容 |
tf.GraphKeys.SUMMARIES | 日志生成相关的张量 | tensorflow计算可视化 |
tf.GraphKeys.QUEUE_RUNNERS | 处理输入的QueueRunner | 输入处理 |
tf.GraphKeys.MOVING_AVERAGE_VARIABLES | 所有计算了滑动平均值的变量 | 计算变量的滑动平均值 |
tensorflow中张量的概念
tensorlfow中,所有的数据都为张量。其中,零阶张量表示标量(scalar),代表一个数;一阶张量表示向量(vector),代表一维数组;n阶张量表示一个n维数组。具体示例如下:
# tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中。a=tf.constant([1.0,2.0], name='a')b=tf.constant([1.0,2.0], name='b')result = tf.add(a,b,name='add')print(result) ''' 输出:Tensor("add:0", shape=(2,), dtype=float32) '''
从上述输出可以看出一个张量主要保存了三个属性:名字(name)、维度(shape)和类型(type)。其中,name属性以“node:src_output”的形式表示,node表示节点的名称,src_output表示当前张量来自节点的第几个输出。还可以通过result.get_shape函数来获取结果张量的维度信息。
tensorflow中session的讲解
创建session的三种方式:
# 1、 创建一个会话with tf.Session() as sess: print(sess.run(result))# tensorflow中需要手动指定默认会话,当该会话指定后,可以通过tf.Tensor.eval函数来计算一个张量的取值。# 2、 创建一个默认的会话sess=tf.Session()with sess.as_default(): print(result.eval())# 3、 创建一个会话 sess=tf.Session()# 下面两个命令等价print(sess.run(result))print(result.eval(session=sess))
# 在交互式环境下,使用设置默认会话的方法来获取张量的取值更加方便,tensorflow提供了一种在交互式环境下直接构建 # 默认会话的函数,tf.InteractiveSession。该函数会自动将生成的会话注册为默认会话。sess= tf.InteractiveSession()print(result.eval()) sess.close()
使用tf.ConfigProto函数配置会话,示例如下
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上
1、运算无法在GPU上执行
2、没有GPU资源(比如本机只有一个GPU,但运算被指定在其他GPU上执行)
3、运算输入包含对CPU计算结果的应用
为了加强代码的可移植性,在有GPU的环境下,一般将该参数设置为True
log_device_placement:一个布尔类型的参数。当设置为True时,日志中将会记录每个节点被安排在了那个设备上方便调试。