TensorFlow入门:TensorFlow工作原理

目录

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

2、TensorFlow数据模型——张量

3、TensorFlow运行模型——会话


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

(1)计算图的概念
TensorFlow 的名字中己经说明了它最重要的两个概念一一TensorFlow。Tensor就是张量,张量可以被简单地理解为多维数组。Flow则体现了它的计算模型。Flow翻译成中文就是“流”,它直观地表达了张量之间通过计算相互转化的过程。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

如下图所示,每一个节点都是一个运算,每一条边代表了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那么这阿玲哥运算有依赖关系。下图中,a和b两个常量不依赖任何其他计算,add计算则依赖读取两个常量的取值。所以在下图中就得到一条从a到add的边和从b到add的边。没有任何计算依赖add节点,所以add节点没有指向其他节点的边。TensorFlow的程序都可以通过类似下图所示的计算图形式来表示。

TensorBoard可视化向量相加的计算图

(2) 计算图的使用

TensorFlow 程序一般可以分为两个阶段。在第一个阶段需要定义计算图中所有的计算;第二个阶段为执行计算。

下边给出计算图中的定义阶段:

import tensorflow as tf
a= tf.constant([l.O, 2 .0], name=”a”)
b = tf.constant([2.0, 3.0], name=”b ”)
result = a + b

在Python中一般会采用“ impot tensorflow as tf”的形式来载入TensorFlow,这样可以使用“ tf”来代替“ tensorflow”作为模块名称,使得整个程序更加简洁。

在这个过程中,TensorFlow 会自动将定义的计算转化为计算图上的节点 。在TensorFlow程序中,系统会自动维护一个默认的计算图,通过 tf.get_default_graph 函数可以获取当前默认的计算图。

以下代码示意了如何获取默认计算图以及如何查看一个运算所属的计算图 :

# 通过a.graph可以查看张所属的计算图。因为没有特意指定,所以这个计算图应该等于
# 当前默认的计算图。所以下面这个操作输出值为True。
print(a.graph is tf.get_default_graph())

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

import tensorflow as tf
gl = tf.Graph()
with gl.as_default () :
    # 在计算图g1中定义变量v,并初始化为0
    v = tf.get_variable(” v ”, initializer=tf.zeros_initializer(shape=[l)))

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

# 在计算图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")))    

以上代码产生了两个计算图,每个计算图中定义了一个名字为“v”的变量。在计算图g1中,将 v 初始化为 0 ;在计算图 g2 中,将 v 初始化为1 。可以看到当运行不同计算图时,变量 v 的值也是不一样的。


2、TensorFlow数据模型——张量

(1)张量的概念
在 TensorFlow程序中,所有的数据都通过张量的形式来表示,从功能的角度上看,张量可以被简单理解为多维数组。张量中并没有存储真正的数字,而是存储张量的结构。一个张量中主要保存了三个属性 : 名字( name )、维度( shape )和类型( type )
张量的第一个属性名字不仅是一个张量的唯一标识符,它同样也给出了这个张量是如何计算出来的。张量的命名可以通过 “node:src_output”的形式来给出。其中 node 为节点的名称 src_output 表示当前张量来自节点的第几个输出(编号从0开始)
(2)张量的使用

张量使用主要可以总结为两大类:

(1)第一类用途是对中间计算结果的引用 。 当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性。以下为使用张量和不使用张量记录中间结果来完成向量相加的功能的代码对比 。

(2)第二类情况是当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字。


3、TensorFlow运行模型——会话

 TensorFlow中的会话(session)来执行定义好的运算。会话拥有并管理 TensorFlow 程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。

TensorFlow中使用会话模式一般有两种:

(1)第一种模式需要明确调用会话生成函数和关闭会话函数,代码流程如下:

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

(2)第二种模式是通过Python的上下文管理器来使用会话,代码流程如下:

# 创建一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
    # 使用创建好的会话来计算关心的结果
    sess.run(...)
    # 不需要再调用“Session.close()”函数来关闭会话
    # 当上下文退出时会话关闭和资源释放也自动完成

通过Python上下文管理器的机制,只要将所有的计算放在 “ with”的内部就可以 。当上下文管理器退出时候会自动释放所有资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值