计算图(Graph)

Tensorflow是基于图(Graph)的计算框架,图的节点由事先定义的运算(操作、Operation)构成,图的各个节点之间由张量(tensor)来链接,Tensorflow的计算过程就是张量(tensor)在节点之间从前到后的流动传输过程,如下图示例:



有向图中,节点通常代表数学运算,边表示节点之间的某种联系,它负责传输多维数据(Tensors)。

节点可以被分配到多个计算设备上,可以异步和并行地执行操作。因为是有向图,所以只有等到之前的入度节点们的计算状态完成后,其后的节点才能执行操作。推广到神经网络中,同一层之间的不同节点上的运算可以异步或并行的执行,但是前后层之间的执行还是要顺序执行,因为后一层的输入依赖于前一层的输出。

上下文环境(Session)

tf的计算必须要在一个Session的上下文中,Session提供了Operation执行和Tensor求值的环境。一个Session可能会拥有一些资源,例如Variable或者Queue。当我们不再需要该session的时候,需要调用sess.close()关闭会话(或使用Python上下文管理器自动关闭),将这些资源释放。

如果在创建Session时没有指定Graph,则该Session会加载默认Graph。如果在一个进程中创建了多个Graph,则需要创建不同的Session来加载每个Graph,而每个Graph则可以加载在多个Session中进行计算,Session与Session之间是相互独立的。

执行流程

Tensorflow的执行可以分为三个步骤:

  • 创建Tensor
  • 定义Operations(Operations输入Tensor,然后输出另一个Tensor)
  • 执行计算(也就是运行一个可计算的图)

一个最简单的Tensorflow计算流程示例如下,实现两个一维向量求和运算:

# -*- coding: utf-8 -*-)
import tensorflow as tf # 1. 创建两个张量(Tensor)
input1 = tf.constant([1.0, 1.0, 1.0, 1.0])
input2 = tf.constant([2.0, 2.0, 2.0, 2.0]) # 2. 定义操作(Operations)
output = tf.add(input1, input2) # 3. 执行计算
with tf.Session() as sess:
result = sess.run(output)
#result = output.eval()
print result
#sess.close() # 使用"with"语句,由python自动管理Session,不再需要显式调用close()

tf中是定义操作(Operations)与执行操作分开的工作模式。上例中定义了一个名称为output的求和操作(也就是图(Graph)上的一个节点),定义操作(Operation)的时候计算不会立即执行,直到在上下文的Session环境中调用run()或eval(),触发了Tensorflow执行计算图,从而获取output计算结点的结果。

更一般的情况下,tf中输入数据可能是不确定或随时变化的,针对这种情况,tf提供了feed注入机制,可以临时替代图(Graph)中操作(Operations)的输入张量(tensor),即把这些数据定义为占位变量,直到执行计算图之前才具体给定数据,再把这些数据以feed_dict的形式作为参数提供给sess.run()调用。feed机制按这种思路,上例改为:

# -*- coding: utf-8 -*-)
import tensorflow as tf # 1. 创建两个占位变量,只定义数值类型和形状(shape),具体数值在计算图执行前给定
input1 = tf.placeholder(tf.float16,shape=[4])
input2 = tf.placeholder(tf.float16,shape=[4]) # 2. 定义操作(Operations)
output = tf.add(input1, input2) # 3. 执行计算
with tf.Session() as sess: input_1 = [1.0, 1.0, 1.0, 1.0]
input_2 = [2.0, 2.0, 2.0, 2.0] result = sess.run(output,feed_dict = {input1:input_1, input2:input_2})
print result

最新文章

  1. Eplan简单教程
  2. pip 直接安装tar.gz zip文件包 (windows linux mac 可用)
  3. DLL学习笔记一(DLL导入导出)
  4. 【Oracle XE系列之二】PLSQL Developer 远程连接Oracle XE数据库
  5. addSubView需要注意的几个点
  6. Python【基础第三篇】
  7. C++模板使用介绍
  8. redhat 6.4 双网卡绑定
  9. ACM——A + B Problem (2)
  10. 一周学会Mootools 1.4中文教程:(2)函数
  11. SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
  12. java中方法传值小知识解析
  13. Spring源码情操陶冶-PathMatchingResourcePatternResolver路径资源匹配溶解器
  14. Docker系统八:Docker的存储驱动
  15. 13 在 Django REST framework 善用 SerializerMethodField方法
  16. * CSS 视觉格式化(基本框、包含块、盒模型、水平格式化、垂直格式化、行布局、em框、内容区、行间距、行内框、行框)
  17. Numpy学习一:ndarray数组对象
  18. python sys.modules模块
  19. Linux jdk安装
  20. 虚函数_构造函数_测试_VS2010x86

热门文章

  1. "export" in SHELL
  2. 【转】Git介绍
  3. Dubbo框架入门介绍
  4. 【Tech】mac下svn和scp使用笔记
  5. opencv manager package was not found 解决办法
  6. linux ip别名和辅助ip地址
  7. 克隆VMware虚拟机
  8. Kubernetes 待学习列表
  9. Response对象介绍(服务器到客户端)
  10. Linux系统用户/用户组/文件权限相关