美文网首页
TensorFlow基本使用

TensorFlow基本使用

作者: Simple_isBeauty | 来源:发表于2018-10-14 13:38 被阅读0次

    一、TensorFlow计算模型——计算图

    • TensorFlow中的所有计算都会被转化为计算图上的节点

    计算图的概念

    • Tensor就是 张量,可以理解为多维数组,表明了它的数据结构,Flow则体现了它的计算模型, Flow是“流”的意思,表达了张量之间通过计算相互转化的过程。TensorFlow是一个通过计算图的形式来表述计算的编程系统,TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
    • 为建模方便,TensorFlow会将常量转化成一种用永远输出固定值的运算

    计算图的使用

    • TensorFlow程序可以分为两个阶段。第一个阶段定义计算图中的所有计算,例如定义加法计算a、b的和
    import tensorflow as tf
    a = tf.constant([1.0, 2,0], name="a")
    b = tf.constant([2.0, 3.0], name="b")
    result = a + b
    
    • 在这个过程中,TensorFlow会自动将定义的计算转化为计算图上的节点,在TensorFlow程序中,系统会维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图,以下展示如何获取默认计算图以及如何查看一个运算所属计算图
    print(a.graph is tf.get_default_graph())
    
    • 除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享,一下生成了一个新的计算图
    import tensorflow as tf
    g1 = tf.Graph()
    with g1.as_default():
        #在计算图g1中定义变量“v”,并设置初始值为0
        v = tf.grt_variable(
            "v", initializeer=tf.zeros_initializeer(shape=[1]))
    #在计算图g1中读取变量“v”的取值
    with  tf.Session(graph=g1) as sess:
        tf.initialize_all_variables().run()
        with tf.variable_scopr("", reuse=True):
            #在计算图g1中,变量v取值0,所以下面这行输出[0.]
            print(sess.run(tf.get_variable("V")))
    
    • TensorFlow中的计算图不仅仅可以用来隔离张量和计算,还提供了管理张量和计算的机制,下面的程序可以将加法计算跑在GPU上
    g = tf.Graph()
    with g.device('/gpu:0'):
        result = a + b
    

    二、TensofFlow数据模型——张量

    • 张量是TensorFlow管理数据的形式

    张量的概念

    • TensorFlow程序中,所有的数据都通过张量的形式来表示,功能上,张量可以被简单理解为多维数组,但张量在TensorFlow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。张量保存的是如何得到这些数字的计算过程。如下,并不会得到加法的结果,而会得到对结果的一个引用
    import tensorflow as tf
    # tf.constant 是一个计算,这个计算的结果为一个张量,保存在变量a中
    a = tf.constant([1.0, 2.0], name="a")
    b = tf.constant([2.0, 3.0], name="b")
    result = a + b
    print result
    ···
    输出:
    Tensor("add:0", shape=(2, ), dtype=float32)
    ···
    
    • TensorFlow中的计算结果为一个张量,并不是一个具体的数字,而是一个张量的结构。一个张量中主要保存了三个属性:名字(name)、维度(shape)和类型(type)
    • 张量的第一个属性名字不仅是一个张量的唯一标识符,同样也给出了这个张量是如何计算出来的。计算图上的每一个节点代表了一个计算,计算的结果就保存在张量中。所以张量和计算图上的节点多代表的计算结果是对应的。这样张量的命名就可以通过“node:src_output”的形式来给出。其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。“add:0”说明result这个张量是计算节点“add”输出的额第一个结果(编号从0开始)
    • 张量的第二个属性是张量的维度
    • 张量的第三个属性是张量了欸行,每一个张量会有一个唯一的类型,不指定了类型,会给出默认类型,不带小数点会被默认int32,带小数点会默认为float32.一般建议制指定dtype类型

    张量的使用

    • 第一类用途是对中间计算结果的引用
    #使用张量记录中间结果
    a = tf.constant([1.0, 2.0], name="a")
    b = tf.constant([2.0, 3.0], name="b")
    reslut = a + b
    #直接计算向量的和,可读性差,无法查看中间状态
    result = a = tf.constant([1.0, 2.0], name="a") + tf.constant([2.0, 3.0], name="b")
    
    • 第二类是当计算图构造完成后,张量可以用来获得计算结果(通过会话取得),例如tf.Session().run(result)语句来得到结果

    三、TensorFlow运行模型——会话

    • TensorFlow会话(session)来执行定义好的运算,会话拥有并管理TensorFlow运行时的所有资源,当所有计算完成后需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的问题。以下为两种模式
    #创建一个会话
    sess = session()
    #使用这个会话得到运算结果
    sess.run(...)
    #关闭会话使得本次运行中的资源得到释放
    sess.close()
    
    #创建一个会话,通过Python中的上下文管理器来管理这个会话
    with tf.Session() as sess:
        #使用这个会话来计算关系的结果
        sess.sun(...)
    #不需要在调用“Session.close()”函数来关闭会话
    #当上下文退出时会话关闭和资源释放也自动完成了
    
    • TensorFlow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入这个计算图中,TensorFlow中的会话也有类似的机制,但TensorFlow不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后,可以通过tf.Tensor.eval函数来计算一个张量的取值。
    sess = tf.Session()
    with sess.as_default():
        print(result.eval())
    

    以下代码也可以完成相同的功能

    sess = tf.Session()
    
    #下面两个命令有相同的功能
    print(sess.run(result))
    print(result.eval(session=sess))
    
    • 在交互环境下(Python脚本或者Jupyter),通过设置默认会话的方式来获取张量的取值会更加方便。TensorFlow提供了一种在交互式环境下直接构建默认会话的函数tf.InteractiveSession。使用这个函数会自动将生成的会话注册为默认会话。
    sess = tf.InteractiveSession()
    print(result.eval())
    sess.close()
    
    • 无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话,下面给出通过ConfigProto配置会话的方法:
    config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
    sess1 = tf.InteractiveSession(config=config)
    sess2 = tf.Session(config=config)
    
    • 通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。

    相关文章

      网友评论

          本文标题:TensorFlow基本使用

          本文链接:https://www.haomeiwen.com/subject/qddaaftx.html