Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
简介
上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统。而图的节点则是由操作(Operation)来构成的,而图的各个节点之间则是由张量(Tensor)作为边来连接在一起的。所以Tensorflow的计算过程就是一个Tensor流图。Tensorflow的图则是必须在一个Session中来计算。这篇笔记来大致介绍一下Session、Graph、Operation和Tensor。
Session
Session提供了Operation执行和Tensor求值的环境。如下面所示,
import tensorflow as tf# Build a graph. a = tf.constant([1.0, 2.0]) b = tf.constant([3.0, 4.0]) c = a * b# Launch the graph in a session. sess = tf.Session()# Evaluate the tensor 'c'. print sess.run(c) sess.close()# result: [3., 8.]
一个Session可能会拥有一些资源,例如Variable或者Queue。当我们不再需要该session的时候,需要将这些资源进行释放。有两种方式,
- 调用session.close()方法;
- 使用with tf.Session()创建上下文(Context)来执行,当上下文退出时自动释放。
上面的例子可以写成,
import tensorflow as tf# Build a graph. a = tf.constant([1.0, 2.0]) b = tf.constant([3.0, 4.0]) c = a * bwith tf.Session() as sess:print sess.run(c)
Session类的构造函数如下所示:
tf.Session.__init__(target='', graph=None, config=None)
如果在创建Session时没有指定Graph,则该Session会加载默认Graph。如果在一个进程中创建了多个Graph,则需要创建不同的Session来加载每个Graph,而每个Graph则可以加载在多个Session中进行计算。
执行Operation或者求值Tensor有两种方式:
调用Session.run()方法: 该方法的定义如下所示,参数fetches便是一个或者多个Operation或者Tensor。
tf.Session.run(fetches, feed_dict=None)
调用Operation.run()或则Tensor.eval()方法: 这两个方法都接收参数session,用于指定在哪个session中计算。但该参数是可选的,默认为None,此时表示在进程默认session中计算。
那如何设置一个Session为默认的Session呢?有两种方式:
1. 在with语句中定义的Session,在该上下文中便成为默认session;上面的例子可以修改成:
import tensorflow as tf# Build a graph. a = tf.constant([1.0, 2.0]) b = tf.constant([3.0, 4.0]) c = a * bwith tf.Session():print c.eval()
2. 在with语句中调用Session.as_default()方法。 上面的例子可以修改成:
import tensorflow as tf# Build a graph. a = tf.constant([1.0, 2.0]) b = tf.constant([3.0, 4.0]) c = a * b sess = tf.Session() with sess.as_default():print c.eval() sess.close()
Graph
Tensorflow中使用tf.Graph类表示可计算的图。图是由操作Operation和张量Tensor来构成,其中Operation表示图的节点(即计算单元),而Tensor则表示图的边(即Operation之间流动的数据单元)。
tf.Graph.__init__()
创建一个新的空Graph
在Tensorflow中,始终存在一个默认的Graph。如果要将Operation添加到默认Graph中,只需要调用定义Operation的函数(例如tf.add())。如果我们需要定义多个Graph,则需要在with语句中调用Graph.as_default()方法将某个graph设置成默认Graph,于是with语句块中调用的Operation或Tensor将会添加到该Graph中。
例如,
import tensorflow as tf g1 = tf.Graph() with g1.as_default():c1 = tf.constant([1.0]) with tf.Graph().as_default() as g2:c2 = tf.constant([2.0])with tf.Session(graph=g1) as sess1:print sess1.run(c1) with tf.Session(graph=g2) as sess2:print sess2.run(c2)# result: # [ 1.0 ] # [ 2.0 ]
如果将上面例子的sess1.run(c1)和sess2.run(c2)中的c1和c2交换一下位置,运行会报错。因为sess1加载的g1中没有c2这个Tensor,同样地,sess2加载的g2中也没有c1这个Tensor。
Operation
一个Operation就是Tensorflow Graph中的一个计算节点。其接收零个或者多个Tensor对象作为输入,然后产生零个或者多个Tensor对象作为输出。Operation对象的创建是通过直接调用Python operation方法(例如tf.matmul())或者Graph.create_op()。
例如c = tf.matmul(a, b)
表示创建了一个类型为MatMul的Operation,该Operation接收Tensor a和Tensor b作为输入,而产生Tensor c作为输出。
当一个Graph加载到一个Session中,则可以调用Session.run(op)来执行op,或者调用op.run()来执行(op.run()是tf.get_default_session().run()的缩写)。
Tensor
Tensor表示的是Operation的输出结果。不过,Tensor只是一个符号句柄,其并没有保存Operation输出结果的值。通过调用Session.run(tensor)或者tensor.eval()方可获取该Tensor的值。
关于Tensorflow的图计算过程
我们通过下面的代码来看一下Tensorflow的图计算过程:
import tensorflow as tf a = tf.constant(1) b = tf.constant(2) c = tf.constant(3) d = tf.constant(4) add1 = tf.add(a, b) mul1 = tf.mul(b, c) add2 = tf.add(c, d) output = tf.add(add1, mul1) with tf.Session() as sess:print sess.run(output) # result: 9
上面的代码构成的Graph如下图所示,
当Session加载Graph的时候,Graph里面的计算节点都不会被触发执行。当运行sess.run(output)的时候,会沿着指定的Tensor output来进图路径往回触发相对应的节点进行计算(图中红色线表示的那部分)。当我们需要output的值时,触发Operation tf.add(add1, mul1)被执行,而该节点则需要Tensor add1和Tensor mul1的值,则往回触发Operation tf.add(a, b)和Operation tf.mul(b, c)。以此类推。
所以在计算Graph时,并不一定是Graph中的所有节点都被计算了,而是指定的计算节点或者该节点的输出结果被需要时。
(done)
转载于:https://www.cnblogs.com/lienhua34/p/5998853.html
Tensorflow学习笔记2:About Session, Graph, Operation and Tensor相关推荐
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- TensorFlow学习笔记--第三节张量(tensor)及其定义方法
目录 在TensorFlow中,所有的数据通过张量的形式来表示 1张量及属性: 1.1维数(阶) 1.2 形状 1.3数据类型 TensorFlow 支持以下三种类型的张量: **1.常量** **2 ...
- python tensorflow学习笔记(五)矩阵乘法运算
相关公式 [0.36424586843872840.6675075448915823]×[0.134750808390697090.5863696301031353]=[0.44048858] \be ...
- TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]
我们都知道,TensorFlow为我们提供了丰富的优化函数,例如GradientDescentOptimizer.这个方法会自动根据loss计算对应variable的导数.示例如下: loss = . ...
- TensorFlow学习笔记:Retrain Inception_v3(一)
转:http://www.jianshu.com/p/613c3b08faea 0. 概要 最新的物体识别模型可能含有数百万个参数,将耗费几周的时间去完全训练.因此我们采用迁移学习的方法,在已经训练好 ...
- tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
- Win10:tensorflow学习笔记(4)
前言 学以致用,以学促用.输出检验,完整闭环. 经过前段时间的努力,已经在电脑上搭好了深度学习系统,接下来就要开始跑程序了,将AI落地了. 安装win10下tensforlow 可以参照之前的例子:w ...
- win10:tensorflow学习笔记(2)
目录: 前言 Tensorflow的故事 1Tensorflow和其他框架的对比 2Tesorflow 目前进展 3大杀器tensorboard 尾声 前言 经过前段时间的努力,已经在电脑上搭好了深度 ...
最新文章
- [c]如何通过结构体元素找到结构体?
- 现在社交APP发展如何?
- CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)
- Origin如何绘制泡泡图?
- 哄骗DB2look 重新创立优化器访问筹划(3)
- 数据库迁移mysql到sqlserver_数据库迁移(sqlserver至mysql)
- 研究机构:全球半导体厂商今年资本支出1081亿美元
- EasyNVR摄像机H5流媒体服务器在windows上批处理脚本自动以管理员权限运行
- linux去掉空行的几种方法
- 3至六年级计算机知识,小学三至六年级下册信息技术教学计划范文
- php smarty安装,Smarty安装
- 手把手教你申请计算机软件著作权(1)——填写软著申请表
- php 三个点的用法 function fun (...$arr){}
- Fault tolerant heap shim applied to current process. This is usually due to previous crashes
- 【图灵学院】JAVA互联网架构【全】
- 1051 复数乘法 分数 15
- rfc4309规范原文和机翻——aead ccm
- 笔记—集成学习—Boosting
- 学习Java用什么软件?
- OIM实现OIM用户修改、OIM用户Disable流程审批
热门文章
- php用重写算出圆柱体的体积,圆柱的体积
- java 类型 字节_Java数据类型-字节
- 教育部双一流计算机名单,清华大学双一流学科名单34个【教育部公布】
- linux wifi修改频率,Linux Custom CRDA WiFi regulatory.bin和40MHz BW 5GHz频...
- 想成为全栈工程师,要做到哪几点?
- 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)
- mysql navicat 设计表_Navicat for MySQL 如何设计报表版面
- 建行参考码大全ybla_52度五粮液价格表大全 不同系列价钱盘点
- 计算机网络查看路由表命令,如何查看、添加、修改、删除路由器内部的路由表项?...
- opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)