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时,日志中将会记录每个节点被安排在了那个设备上方便调试。