tensorflow入门:计算图、张量和会话

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)



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值