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
print(a.graph is tf.get_default_graph())
通过a.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中张量的概念
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、 创建一个会话
# 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上。
log_device_placement:一个布尔类型的参数。当设置为True时,日志中将会记录每个节点被安排在
了那个设备上方便调试。