简介

上一篇笔记: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的时候,需要将这些资源进行释放。有两种方式,

  1. 调用session.close()方法;
  2. 使用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有两种方式:

  1. 调用Session.run()方法: 该方法的定义如下所示,参数fetches便是一个或者多个Operation或者Tensor。

    tf.Session.run(fetches, feed_dict=None)

  2. 调用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相关推荐

  1. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记--使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  2. TensorFlow学习笔记--第三节张量(tensor)及其定义方法

    目录 在TensorFlow中,所有的数据通过张量的形式来表示 1张量及属性: 1.1维数(阶) 1.2 形状 1.3数据类型 TensorFlow 支持以下三种类型的张量: **1.常量** **2 ...

  3. python tensorflow学习笔记(五)矩阵乘法运算

    相关公式 [0.36424586843872840.6675075448915823]×[0.134750808390697090.5863696301031353]=[0.44048858] \be ...

  4. TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]

    我们都知道,TensorFlow为我们提供了丰富的优化函数,例如GradientDescentOptimizer.这个方法会自动根据loss计算对应variable的导数.示例如下: loss = . ...

  5. TensorFlow学习笔记:Retrain Inception_v3(一)

    转:http://www.jianshu.com/p/613c3b08faea 0. 概要 最新的物体识别模型可能含有数百万个参数,将耗费几周的时间去完全训练.因此我们采用迁移学习的方法,在已经训练好 ...

  6. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  7. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  8. Win10:tensorflow学习笔记(4)

    前言 学以致用,以学促用.输出检验,完整闭环. 经过前段时间的努力,已经在电脑上搭好了深度学习系统,接下来就要开始跑程序了,将AI落地了. 安装win10下tensforlow 可以参照之前的例子:w ...

  9. win10:tensorflow学习笔记(2)

    目录: 前言 Tensorflow的故事 1Tensorflow和其他框架的对比 2Tesorflow 目前进展 3大杀器tensorboard 尾声 前言 经过前段时间的努力,已经在电脑上搭好了深度 ...

最新文章

  1. [c]如何通过结构体元素找到结构体?
  2. 现在社交APP发展如何?
  3. CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)
  4. Origin如何绘制泡泡图?
  5. 哄骗DB2look 重新创立优化器访问筹划(3)
  6. 数据库迁移mysql到sqlserver_数据库迁移(sqlserver至mysql)
  7. 研究机构:全球半导体厂商今年资本支出1081亿美元
  8. EasyNVR摄像机H5流媒体服务器在windows上批处理脚本自动以管理员权限运行
  9. linux去掉空行的几种方法
  10. 3至六年级计算机知识,小学三至六年级下册信息技术教学计划范文
  11. php smarty安装,Smarty安装
  12. 手把手教你申请计算机软件著作权(1)——填写软著申请表
  13. php 三个点的用法 function fun (...$arr){}
  14. Fault tolerant heap shim applied to current process. This is usually due to previous crashes
  15. 【图灵学院】JAVA互联网架构【全】
  16. 1051 复数乘法 分数 15
  17. rfc4309规范原文和机翻——aead ccm
  18. 笔记—集成学习—Boosting
  19. 学习Java用什么软件?
  20. OIM实现OIM用户修改、OIM用户Disable流程审批

热门文章

  1. php用重写算出圆柱体的体积,圆柱的体积
  2. java 类型 字节_Java数据类型-字节
  3. 教育部双一流计算机名单,清华大学双一流学科名单34个【教育部公布】
  4. linux wifi修改频率,Linux Custom CRDA WiFi regulatory.bin和40MHz BW 5GHz频...
  5. 想成为全栈工程师,要做到哪几点?
  6. 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)
  7. mysql navicat 设计表_Navicat for MySQL 如何设计报表版面
  8. 建行参考码大全ybla_52度五粮液价格表大全 不同系列价钱盘点
  9. 计算机网络查看路由表命令,如何查看、添加、修改、删除路由器内部的路由表项?...
  10. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)