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

在第一节中,我们介绍了一些编程技巧;第一部分,基本用法,但是内容太少,解释不多,本节补充前面的内容,深入学习解释。

这个名字来源于它自己的工作原理。 () 表示 N 维数组,Flow 表示基于数据流图的计算。是张量从图像的一端流到另一端的计算过程,也是编程模型。

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

一种运行机制

运行机制属于“定义”和“运行”的分离。从操作层面上,可以抽象为构建模型和运行模型两种。

在开始构建模型之前,需要解释一些概念。在一个称为“图表”的容器中包含:

图表描述了计算的过程。为了执行计算,必须在会话中启动图,该会话将图操作分发到 CPU 或 GPU 等设备上,上面还提供了执行操作的方法。执行完这些方法后,会产生返回。在语言中,返回是一个numpy数组对象,而在C或C++语言中,返回是:一个实例。

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

使用第二种1.案例

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

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的使用
'''

图片[1]-第五节,TensorFlow编程基础案例-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.]

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

为了便于使用诸如此类的交互环境,可以使用替代类,使用 .eval() 和 .run() 方法代替 .run(),避免使用变量来保存会话。

2.注入机制

feed 将操作的输出临时替换为一个值。您可以提供一个提要数据作为参数传递给 run() 调用。提要仅在调用它的方法内有效,当方法结束时,提要消失。最常见的用例是将一些特殊操作指定为“feed”操作,标记的方法是使用 tf.() 为这些操作创建占位符。下面将演示如何使用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})))

注意,本例中的最后一次打印一次提取两个节点的值。

3.指定 GPU 操作

在实现中,将图形定义转换为以分布式方式执行的操作,以充分利用可用的计算资源(如CPU或GPU)。一般不需要明确指定是使用CPU还是GPU,可以自动检测。如果检测到 GPU,它将尝试使用找到的第一个 GPU 来执行操作。如果机器上有多个可用的 GPU,除了第一个 GPU 之外的 GPU 默认不参与计算。为了使用这些 GPU,您必须显式地将 op 分配给它们以供执行。 with… 语句用于分配特定的 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.构建一个,在中指定相关GPU,并传入参数=’自己创建’指定GPU操作

tf.参数如下:

config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
session = tf.Session(config = config)

4.设置GPU使用资源

在上述 tf.函数生成后,还可以设置其属性来分配GPU计算资源。以下代码表示按需分配。最初分配少量的 GPU 容量,然后根据需要慢慢增加,由于内存没有释放而导致碎片。

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

同样,上面的代码也可以在创建的时候指定,如下:

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

我们还可以为 GPU 分配固定大小的计算资源。例如分配给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)

查看代码

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片