• 第五节,TensorFlow编程基础案例-session使用(上)


    在第一节中我们已经介绍了一些TensorFlow的编程技巧;第一节,TensorFlow基本用法,但是内容过于偏少,对于TensorFlow的讲解并不多,这一节对之前的内容进行补充,并更加深入了解讲解TensorFlow.

    TesorFlow的命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。TensorFlow是张量从图像的一端流动到另一端的计算过程,这也是TensorFlow的编程模型。

    TensorFlow编程基础上主要介绍session的创建,以及session与图的交互机制,最后讲解一下在session中指定GPU运算资源。

    一 运行机制

    TensorFlow的运行机制属于"定义"与”运行“相分离。从操作层面可以抽象成两种:构造模型和模型运行。

    在讲解构建模型之前,需要讲解几个概念。在一个叫做"图"的容器中包括:

    • 张量(tensor):TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是tensor,你可以把TensorFlow tensor看做一个n维的数组或者列表。
    • 变量(Variable):常用于定义模型中的参数,是通过不断训练得到的值。比如权重和偏置。
    • 占位符(placeholder):输入变量的载体。也可以理解成定义函数时的参数。
    • 图中的节点操作(op):一个op获得0个或者多个Tensor,执行计算,产生0个或者多个Tensor。op是描述张量中的运算关系,是网络中真正结构。

    一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话里启动,会话将图的op分发到诸如CPU或者GPU的设备上,同时提供执行op的方法,这些方法执行后,将产生的tensor返回,在python语言中,返回的tensor是numpy array对象,在C或者C++语言中,返回的tensor是tensorflow:Tensor实例。

     session与图的交互过程中定义了以下两种数据的流向机制。

    • 注入机制(feed):通过占位符向模式中传入数据。
    • 取回机制(fetch):从模式中取得结果。

    二  session的使用

    1.session案例

    第一个案例是通过session输出一段字符串信息,通过这个案例,让我们了解session如何创建。

    import tensorflow as tf
    '''
    TensorFlow 编程基础
    '''
    
    '''
    1.编写hello world程序掩饰session的使用
       建立一个session,在session中输出hello TensorFlow    
    '''
    
    #定义一个常量
    hello = tf.constant('hello TensorFlow')
    
    #构造阶段完成后,才能启动图,启动图的第一步是创建一个Session对象,如果无任何创建函数,会话构造器将启动默认图
    sess = tf.Session()
    #通过session里面的run()函数来运行结果
    print(sess.run(hello))
    #或者
    print(hello.eval(session=sess))
    #任务完毕,关闭会话,Session对象在使用完毕后需要关闭以释放资源,除了显示调用close()外,也可以使用with代码块
    sess.close()
    
    
    '''
    2. with session的使用
    '''
    a = tf.constant(3)
    b = tf.constant(4)
    with tf.Session() as sess:
        print(' a + b =  {0}'.format(sess.run(a+b)))
        print(' a * b =  {0}'.format(sess.run(a*b)))
        
        
    '''
    3.交互式session
    '''
    #进入一个交互式TensorFlow会话
    sess = tf.InteractiveSession()
    
    x = tf.Variable([1.0,2.0])
    a = tf.constant([3.0,3.0])
    
    #使用初始化器 initinalizer op的run()初始化x
    x.initializer.run()
    
    #增加一个减去sub op,从 x 减去 a,运行减去op,输出结果
    sub = tf.subtract(x,a)
    print(sub.eval())               #[-2. -1.]    

    上面使用了三种方法创建session,一个是是用了with代码块,一个是没有使用with代码块。还有几种交互式session方式。

    为了方便使用诸如Jupter之类的Python交互环境,可以使用InteractiveSession替代Session类,使用Tensor.eval()和Operation.run()方法来代替Session.run(),这样可以避免使用一个变量来持有会话。

    2.session的注入机制

    feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束,feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。下面将演示如何使用feed机制将上一个案例程序中的数值通过占位符传入。

    '''
    4.注入机制
    '''
    a = tf.placeholder(dtype=tf.float32)
    b = tf.placeholder(dtype=tf.float32)
    add = a + b
    product = a*b
    with tf.Session() as sess:
        #启动图后,变量必须先经过'初始化' op 
        sess.run(tf.global_variables_initializer())
        print(' a + b =  {0}'.format(sess.run(add,feed_dict={a:3,b:4})))
        print(' a * b =  {0}'.format(sess.run(product,feed_dict={a:3,b:4})))
       #一次取出两个节点值
    print(' {0}'.format(sess.run([add,product],feed_dict={a:3,b:4})))

    注意这个案例最后一个print一次取出来两个节点的值。

    3.指定GPU运算

    在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU).一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:

    '''
    5.指定GPU运算
    '''
    with tf.Session() as sess:
        with tf.device("/cpu:0"):
            print(sess.run(product,feed_dict={a:3,b:4}))

    设备用字符串进行标识. 目前支持的设备包括: "/cpu:0": 机器的 CPU. "/gpu:0": 机器的第一个 GPU, 如果有的话. "/gpu:1": 机器的第二个 GPU, 以此类推.

    类似的还有通过tf.ConfigProto来构建一个config,在config中指定相关的GPU,并且在session中传入参数config='自己创建的config'来指定GPU操作
    tf.ConfigProto参数如下:

    • log_device_placement = True:是否打印设备分配日志
    • allow_soft_placement = True:如果指定的设备不存在,允许TF自动分配设备
    config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
    session = tf.Session(config = config)

    4.设置GPU使用资源

    上面的tf.ConfigProto函数生成config之后,还可以设置其属性来分配GPU的运算资源。如下代码就是按需分配的意思。刚开始会分配少量的GPU容量,然后按需慢慢地增加,由于不会释放内存,所以会导致碎片。

    '''
    6 设置GPU使用资源
    '''
    #按需分配GPU使用的资源
    config.gpu_options.allow_growth = True

    同样,上述代码也可以放在config创建时指定,如下:

    #或者
    gpu_options = tf.GPUOptions(allow_growth = True)
    config = tf.ConfigProto(gpu_options = gpu_options)

    我们还可以给GPU分配固定大小得计算资源,如分配给tensorflow的GPU的显存的大小为:GPU显存x0.7

    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.7)

     完整代码:

    # -*- coding: utf-8 -*-
    """
    Created on Tue Apr 17 19:47:48 2018
    
    @author: zy
    """
    
    
    import tensorflow as tf
    '''
    TensorFlow 编程基础上
        这一节主要介绍session的创建,以及session与图的交互机制,最后讲解一下在session中指定GPU运算资源。
    '''
    
    '''
    1.编写hello world程序掩饰session的使用
       建立一个session,在session中输出hello TensorFlow    
    '''
    
    #定义一个常量
    hello = tf.constant('hello TensorFlow')
    
    #构造阶段完成后,才能启动图,启动图的第一步是创建一个Session对象,如果无任何创建函数,会话构造器将启动默认图
    sess = tf.Session()
    #通过session里面的run()函数来运行结果
    print(sess.run(hello))
    #或者
    print(hello.eval(session=sess))
    #任务完毕,关闭会话,Session对象在使用完毕后需要关闭以释放资源,除了显示调用close()外,也可以使用with代码块
    sess.close()
    
    
    '''
    2. with session的使用
    '''
    a = tf.constant(3)
    b = tf.constant(4)
    with tf.Session() as sess:
        print(' a + b =  {0}'.format(sess.run(a+b)))
        print(' a * b =  {0}'.format(sess.run(a*b)))
        
        
    '''
    3.交互式session
    '''
    #进入一个交互式TensorFlow会话
    sess = tf.InteractiveSession()
    
    x = tf.Variable([1.0,2.0])
    a = tf.constant([3.0,3.0])
    
    #使用初始化器 initinalizer op的run()初始化x
    x.initializer.run()
    
    #增加一个减去sub op,从 x 减去 a,运行减去op,输出结果
    sub = tf.subtract(x,a)
    print(sub.eval())               #[-2. -1.]    
    
    
    '''
    4.注入机制
    '''
    a = tf.placeholder(dtype=tf.float32)
    b = tf.placeholder(dtype=tf.float32)
    add = a + b
    product = a*b
    with tf.Session() as sess:
        #启动图后,变量必须先经过'初始化' op 
        sess.run(tf.global_variables_initializer())
        print(' a + b =  {0}'.format(sess.run(add,feed_dict={a:3,b:4})))
        print(' a * b =  {0}'.format(sess.run(product,feed_dict={a:3,b:4})))
        #一次取出两个节点值
        print(' {0}'.format(sess.run([add,product],feed_dict={a:3,b:4})))
        
        
    '''
    5.指定GPU运算
    '''
    '''
    设备用字符串进行标识. 目前支持的设备包括:
        "/cpu:0": 机器的 CPU.
        "/gpu:0": 机器的第一个 GPU, 如果有的话.
        "/gpu:1": 机器的第二个 GPU, 以此类推.
    '''
    with tf.Session() as sess:
        with tf.device("/cpu:0"):
            print(sess.run(product,feed_dict={a:3,b:4}))
            
    '''
    通过tf.ConfigProto来构建一个config,在config中指定相关的GPU,并且在session中传入参数config='自己创建的config'来指定GPU操作
    tf.ConfigProto参数如下
    log_device_placement = True:是否打印设备分配日志
    allow_soft_placement = True:如果指定的设备不存在,允许TF自动分配设备
    '''
    config = tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
    session = tf.Session(config = config)
    
    
    '''
    6 设置GPU使用资源
    '''
    #tf.ConfigProto生成之后,还可以按需分配GPU使用的资源
    config.gpu_options.allow_growth = True
    #或者
    gpu_options = tf.GPUOptions(allow_growth = True)
    config = tf.ConfigProto(gpu_options = gpu_options)
    
    #给GPU分配固定大小得计算资源,如分配给tensorflow的GPU的显存的大小为:GPU显存x0.7
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.7)
    View Code
  • 相关阅读:
    源码篇:Python 实战案例----银行系统
    源码分享篇:使用Python进行QQ批量登录
    python制作电脑定时关机办公神器,另含其它两种方式,无需编程!
    Newtonsoft.Json 去掉
    C#Listview添加数据,选中最后一行,滚屏
    C# 6.0语法糖
    XmlHelper
    AppSettings操作类
    JsonHelper
    JS加载获取父窗体传递的参数
  • 原文地址:https://www.cnblogs.com/zyly/p/8869763.html
Copyright © 2020-2023  润新知