Tensorflow是一个用计算图的形式来表述计算的编程系统
每个计算时计算图中的一个节点,就是一个tensor;边表示了节点之间的依赖关系,即flow
在tensorflow程序中,系统会维护一张默认的计算图,可以通过tf.get_default_graph来获取当前的计算图
import tensorflow as tf
a=tf.constant([1.0,2.0],name="a")
b=tf.constant([2.0,3.0],name="b")
print(a.graph is tf.get_default_graph())#获取默认的计算图和查看一个运算所属的计算图
除了使用默认的计算图,tensorflow还支持通过tf.Graph来创建新的计算图,不同的计算图上的张量和运算都不会共享。
g1=tf.Graph()#生成新的计算图 with g1.as_default(): #在计算图g1中定义变量"v",并初始化为0 v=tf.get_variable("v",[1],initializer=tf.zeros_initializer()) g2=tf.Graph() with g2.as_default(): v=tf.get_variable("v",[1],initializer=tf.ones_initializer())
#在计算图g1中读取变量"v"的取值 with tf.Session(graph=g1) as sess: tf.initialize_all_variables().run() with tf.variable_scope("",reuse=True): print(sess.run(tf.get_variable("v")))
#在计算图g2中读取变量"v"的取值 with tf.Session(graph=g2) as sess: tf.initialize_all_variables().run() with tf.variable_scope("",reuse=True): print(sess.run(tf.get_variable("v")))
在变量的空间中with tf.variable_scope()当reuse为False时创建变量,当为True时可以获取已经创建的名字是**的变量
with tf.variable_scope("zyy"):#zyy的命名空间
v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) #在zyy的命名空间内创建名字为v的变量
with tf.variable_scope("zyy",reuse=True):#zyy的命名空间
print(tf.get_variable("v",[1])) #在zyy的命名空间内创建名字为v的变量
计算图可以选择在GPU上进行运算
g=tf.Graph()
with g.device('/gpu:0'): result=a+b print(result)
下面是一个求导的例子
import numpy as np
np.random.seed(0)
N,D=3,4
with tf.device('/gpu:0'):
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
z=tf.placeholder(tf.float32)
a=x*y
b=a+z
c=tf.reduce_sum(b)
grad_x,grad_y,grad_z=tf.gradients(c,[x,y,z])with tf.Session() as sess:
values={
x:np.random.randn(N,D),
y:np.random.randn(N,D),
z:np.random.randn(N,D),
}
out=sess.run([c,grad_x,grad_y,grad_z],feed_dict=values)
c_val,grad_x_val,grad_y_val,grad_z_val=out
#张量就相当于是多维数组,但是它里面保存的不是数字,而是对tensorflow结果的引用,保存计算过程。
import tensorflow as tf
a=tf.constant([1.0,2.0],name="a")
b=tf.constant([2.0,3.0],name="b")
with g.device('/gpu:0'):
result=a+b
tf.Session().run(result)
#tensorflow的计算结果不是一个具体的数字,而是一个张量的结构,名字,维度,类型
#计算图中每一个节点代表了一个计算,add:0表示这个张量是计算节点“add”输出的第一个结果
#若把b=tf.constant([2,3],name="b"),会报类型不匹配的错,如果指定类型b=tf.constant([2,3],name="b",dtype=tf.float32)也是对的,否则默认为tf.int32
创建一个session,一定要关闭,不然会内存泄漏
sess=tf.Session()
sess.run(result)
sess.close()
除非是创建上下文空间,即使程序异常,也不会内存泄漏
with tf.Session() as sess:
sess.run(result)
#不需要再调用close来关闭会话,当上下文退出时会话关闭和资源释放也自动完成了
tensorflow不会创建默认会话,需要手动指定,指定之后可以通过Tensor.eval()来获取一个张量的数值
#没有特殊指定的运算会自动加入默认计算图中,会话也有类似机制,但tensorflow不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后
#可以通过tf.Tensor.eval函数来计算一个张量的取值
sess=tf.Session()
with sess.as_default():
print(result.eval())
#或者
with tf.Session() as sess:
print(result.eval()) #或者
sess=tf.Session()
print(sess.run(result))
print(result.eval(session=sess))
#在交互式环境下,通过设置默认会话来获取张量的取值更加方便,这个函数就是tf.InteractiveSession()
sess=tf.InteractiveSession()
print(result.eval())
sess.close()
#无论哪种方式都可以用ConfigProto Protocol Buffer来配置需要生成的会话
config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)
#allow_soft_placement设置为True时,GPU的运算可以放到CPU上,当GPU资源不够时
#log_device_placement设置为True时,记录每个节点被安排在哪个设备上以方便调试,一般设置为False
sess1=tf.InteractiveSess(config=config)
sess2=tf.Session(config=config)