Tensorflow基础概念

1、Tensorflow计算模型--计算图

    计算图是Tensorflow的基础概念,Tensorflow中所有的计算都会被转化为计算图上的节点。Tensorflow中两个重要的概念就是Tensor 和 Flow。Tensor就是张量,可以被简单理解为多位数组。Flow更多的体现了他的计算模型。Tensorflow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。一般可以用TensorBoard画出计算图。

1.1 计算图的使用

>>> 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程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算。

    通过a.graph剋查看张量所属的计算图,如果没有特定指定,这个计算图应该等于当前默认的计算图。

>>> a.graph
<tensorflow.python.framework.ops.Graph object at 0x7f591bc14358>
>>> print(a.graph is tf.get_default_graph())
True

    除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享。以下代码示意了如何在不同计算图上定义和使用变量。

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
        #在计算图g1中定义变量“v”,并设置初始值为1
        v = tf.get_variable("v", shape=[1], initializer=tf.zeros_initializer)

g2 = tf.Graph()
with g2.as_default():
        #在计算图g2中定义变量“ v” ,并设置初始值为1
        v = tf.get_variable("v", shape=[1], initializer=tf.ones_initializer)

#在计算图g1中读取变量“v"的取值
with tf.Session(graph=g1) as sess:
        tf.global_variables_initializer().run()
        with tf.variable_scope("", reuse=True):
                #在计算图g1中,变量“v的取值应该为0,所以下面这行会输出[0.]
                print(sess.run(tf.get_variable("v")))

#在计算图g2中读取变量“ v"的取值
with tf.Session(graph=g2) as sess:
        tf.global_variables_initializer().run()
        with tf.variable_scope("", reuse=True):
                #在计算图g2中,变量“v”的取值应该1,所以下面这行会输出[1.]
                print(sess.run(tf.get_variable("v")))
[0.]
[1.]

    计算图可以通过tf.Graph.device函数来指定运行计算的设备,以下代码可以将加法计算跑在GPU上

g=tf.Graph()
#指定计算运行设备
with g.device('/gpu:0'):
    result=a+b

    有效的正例TensorFlow程序中的资源也是计算图的一个重要功能。在一个计算图中,可以通过集合collection来管理不同类别的资源。比如通过tf.add_to_collection函数可以将资源加入一个或者多个集合中,然后通过tf.get_collection获取一个集合中的所有资源。这些资源包括张量、变量或者运行Tensorflow程序所需要的资源,等等。为了方便计算,TensorFlow也自动管理一些最常用的集合,如下图

Tensorflow中维护的集合列表
集合名称集合内存使用场景
tf.GraphKeys.VARIABLES所有变量持久化TensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES

可学习的变量(一般指

的神经网络中的参数)

模型训练、声称模型可视化内容
tf.GraphKeys.SUMMARIES日志生成相关张量TensorFlow计算可视化
tf.GraphKeys.QUEUE_RUNNERS处理输入的QueueRunner输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES所有计算了滑动平均值的变量计算变量的滑动平均值

2、Tensorflow数据模型--张量

2.1 张量的概念

    从功能的角度上讲,张量可以简单理解为多位数组。但张量在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 = tf.add(a, b, name="add")
print(result)
Tensor("add:0", shape=(2,), dtype=float32)

     从运行结果来看,一个张量主要保存了三个属性:名字(name)、维度(shape)和类型(type)。

     给tensor指定类型,一般用dtype。Tensorflow支持14中不同的类型,主要包括实数(tf.float32、tf.float64)、整数(tf.int8、tf.int16、tf.int32、tf.int64、tf.uint8)、布尔型(tf.bool)和复数(tf.complex64、tf.complex128)。

2.2 张量的使用

    张量使用主要分为两大类。第一类是对中间计算结果的引用。当一个计算包含许多中间结果,使用张量可以大大提高代码的可读性。以下为使用张量和不是用张量记录中间结果来完成向量功能代码对比

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

#直接计算向量的和,这样可读性会比较差
result1 = tf.constant([1.0, 2.0], name="a") + \
        tf.constant([2.0, 3.0], name="b")

3、TensorFlow运行模型--会话

    会话拥有并管理Tensorflow程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。TensorFlow中使用会话的模式一般有两种,第一种需要明确会话生成函数和关闭会话函数,这种模式的代码流程如下。

#创建一个会话
sess = tf.Session()
#使用这个创建好的会话来得到运算结果,比如可以调用sess.run(result)
#来得到之前样例中张量result的取值
sess.run(...)
#关闭会话使得本次运行中使用到的资源可以释放
sess.close()

    但是当程序出现异常时候,关闭会话的函数可能就不会被执行导致资源泄露。为了防止异常退出时资源释放的问题,可以通过Python的上下文管理器来使用会话。

#创建一个会话,并通过Python的上下文管理器来管理这个会话
with tf.Session() as sess:
    #使用创建好的会话来计算结果
    sess.run(...)

    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))

  output

[3. 5.]

   在交互式环境下,通过设置默认会话的方式来获取张量的取值更加方便。所以TensorFlow提供了一种在交互式环境下直接构建默认会话的函数,tf.InteractiveSession。使用这个函数会自动将生成的会话注册为默认会话。

sess=tf.InteractiveSession()
print(result.eval)
sess.close()

    通过tf.InteractiveSession函数可以省去将长生的会话注册为默认会话的过程。无论使用哪种方法都可以通过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分配策略、运算超时时间等参数。在这些参数中,最常用的有两个。第一个是allow_soft_palecment,这是一个布尔型参数,当为True时,在一下任意一个条件成立是,GPU上的运算可以放到CPU上进行:

1、运算无法在GPU上执行。

2、没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU)

3、运算输入包含对CPU计算结果的引用

    该参数默认值为False,为了代码的可移植性更强,在有GPU环境下这个参数一般会被设置为True。通过将该参数设置为True,可以让程序在拥有不同数量的GPU机器上顺利运行。

    第二个使用较多的是log_device_placement。这也是一个布尔类型参数,当他为True时日志辉记录下每个节点被安排在哪个设备上以方便调试。而在生产环境中将这个参数设置为False可以将少日志量。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值