Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现


Posted in Python onApril 22, 2020

Tensorflow编程系统

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

Tensorflow工具或者说深度学习本身就是一个连贯紧密的系统。一般的系统是一个自治独立的、能实现复杂功能的整体。系统的主要任务是对输入进行处理,以得到想要的输出结果。我们之前见过的很多系统都是线性的,就像汽车生产工厂的流水线一样,输入->系统处理->输出。系统内部由很多单一的基本部件构成,这些单一部件具有特定的功能,且需要稳定的特性;系统设计者通过特殊的连接方式,让这些简单部件进行连接,以使它们之间可以进行数据交流和信息互换,来达到相互配合而完成具体工作的目的。

对于任何一个系统来说,都应该拥有稳定、独立、能处理特殊任务的单一部件;且拥有一套良好的内部沟通机制,以让系统可以健康安全的运行。

现实中的很多系统都是线性的,被设计好的、不能进行更改的,比如工厂的流水线,这样的系统并不具备自我调整的能力,无法对外界的环境做出反应,因此也就不具备“智能”。

深度学习(神经网络)之所以具备智能,就是因为它具有反馈机制。深度学习具有一套对输出所做的评价函数(损失函数),损失函数在对神经网络做出评价后,会通过某种方式(梯度下降法)更新网络的组成参数,以期望系统得到更好的输出数据。

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

由此可见,神经网络的系统主要由以下几个方面组成:

  • 输入
  • 系统本身(神经网络结构),以及涉及到系统本身构建的问题:如网络构建方式、网络执行方式、变量维护、模型存储和恢复等等问题
  • 损失函数
  • 反馈方式:训练方式

定义好以上的组成部分,我们就可以用流程化的方式将其组合起来,让系统对输入进行学习,调整参数。因为该系统的反馈机制,所以,组成的方式肯定需要循环。

而对于Tensorflow来说,其设计理念肯定离不开神经网络本身。所以,学习Tensorflow之前,对神经网络有一个整体、深刻的理解也是必须的。如下图:Tensorflow的执行示意。

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

那么对于以上所列的几点,什么才是最重要的呢?我想肯定是有关系统本身所涉及到的问题。即如何构建、执行一个神经网络?在Tensorflow中,用计算图来构建网络,用会话来具体执行网络。深入理解了这两点,我想,对于Tensorflow的设计思路,以及运行机制,也就略知一二了。

图(tf.Graph):计算图,主要用于构建网络,本身不进行任何实际的计算。计算图的设计启发是高等数学里面的链式求导法则的图。我们可以将计算图理解为是一个计算模板或者计划书。

会话(tf.session):会话,主要用于执行网络。所有关于神经网络的计算都在这里进行,它执行的依据是计算图或者计算图的一部分,同时,会话也会负责分配计算资源和变量存放,以及维护执行过程中的变量。

接下来,我们主要从计算图开始,看一看Tensorflow是如何构建、执行网络的。

计算图

在开始之前,我们先复习一下Tensorflow的几种基本数据类型:

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
tf.Variable(initializer, name)
tf.placeholder(dtype, shape=None, name=None)

复习完毕。

graph = tf.Graph()
with graph.as_default():
 img = tf.constant(1.0, shape=[1,5,5,3])

以上代码中定义了一个计算图,在该计算图中定义了一个常量。Tensorflow默认会创建一张计算图。所以上面代码中的前两行,可以省略。默认情况下,计算图是空的。

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

在执行完img = tf.constant(1.0, shape=[1,5,5,3])以后,计算图中生成了一个node,一个node结点由name, op, input, attrs组成,即结点名称、操作、输入以及一系列的属性(类型、形状、值)等组成,计算图就是由这样一个个的node组成的。对于tf.constant()函数,只会生成一个node,但对于有的函数,如tf.Variable(initializer, name)(注意其第一个参数是初始化器)就会生成多个node结点(后面会讲到)。

那么执行完img = tf.constant(1.0, shape=[1,5,5,3])后,计算图中就多一个node结点。(因为每个node的属性很多,我只表示name,op,input属性)

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

继续添加代码:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])

代码执行后的计算图如下:

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

需要注意的是,如果没有对结点进行命名,Tensorflow自动会将其命名为:Const、Const_1、const_2......。其他类型的结点类同。

现在,我们添加一个变量:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)

该变量用一个常量作为初始化器。我们先看一下计算图:

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

如图所示:
执行完tf.Variable()函数后,一共产生了三个结点:

  • Variable:变量维护(不存放实际的值)
  • Variable/Assign:变量分配
  • Variable/read:变量使用

图中只是完成了操作的定义,但并没有执行操作(如Variable/Assign结点的Assign操作,所以,此时候变量依然不可以使用,这就是为什么要在会话中初始化的原因)。

我们继续添加代码:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")

得到的计算图如下:

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

可以看出,变量读取是通过Variable/read来进行的。

如果在这里我们直接开启会话,并执行计算图中的卷积操作,系统就会报错。

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
with tf.Session() as sess:
  sess.run(y2)

这段代码错误的原因在于,变量并没有初始化就被使用,而从图中清晰的可以看到,直接执行卷积,是回溯不到变量的值(Const_1)的(箭头方向)。

所以,在执行之前,要进行初始化,代码如下:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
init = tf.global_variables_initializer()

执行完tf.global_variables_initializer()函数以后,计算图如下:

Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

tf.global_variables_initializer()产生了一个名为init的node,该结点将所有的Variable/Assign结点作为输入,以达到对整张计算图中的变量进行初始化。
所以,在开启会话后,执行的第一步操作,就是变量初始化(当然变量初始化的方式有很多种,我们也可以显示调用tf.assign()来完成对单个结点的初始化)。
完整代码如下:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
init = tf.global_variables_initializer()
with tf.Session() as sess:
  sess.run(init)
  # do someting....

会话

在上述代码中,我已经使用会话(tf.session())来执行计算图了。在tf.session()中,我们重点掌握无所不能的sess.run()。

一个session()中包含了Operation被执行,以及Tensor被evaluated的环境。

tf.Session().run()函数的定义:

run(
  fetches,
  feed_dict=None,
  options=None,
  run_metadata=None
)

tf.Session().run()函数的功能为:执行fetches参数所提供的operation操作或计算其所提供的Tensor。

run()函数每执行一步,都会执行与fetches有关的图中的所有结点的计算,以完成fetches中的任务。其中,feed_dict提供了部分数据输入的功能。(和tf.Placeholder()搭配使用,很舒服)

参数说明:

  • fetches:可以是图中的一个结点,也可以是一个List或者字典,此时候返回值与fetches格式一致;该参数还可以是一个Operation,此时候返回值为None。
  • feed_dict:字典格式。给模型输入其计算过程中所需要的值。

当我们把模型的计算图构建好以后,就可以利用会话来进行执行训练了。

在明白了计算图是如何构建的,以及如何被会话正确的执行以后,我们就可以愉快的开始Tensorflow之旅啦。

参考链接

https://jacobbuckman.com/

https://danijar.com/what-is-a-tensorflow-session/

http://looop.cn/?p=3365

到此这篇关于Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现的文章就介绍到这了,更多相关Tensorflow tf.Graph tf.Session内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
python删除文本中行数标签的方法
May 31 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
python 图像平移和旋转的实例
Jan 10 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
总结Python使用过程中的bug
Jun 18 Python
Django实现图片上传功能步骤解析
Apr 22 #Python
Django框架配置mysql数据库实现过程
Apr 22 #Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 #Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 #Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 #Python
Django数据结果集序列化并展示实现过程
Apr 22 #Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 #Python
You might like
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
php实现倒计时效果
2015/12/19 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
vuejs如何配置less
2017/04/25 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
python实现雨滴下落到地面效果
2018/06/21 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python多线程获取返回值代码实例
2020/02/17 Python
python自动生成sql语句的脚本
2021/02/24 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
班级活动策划书
2014/02/06 职场文书
小学毕业感言50字
2014/02/16 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
医生辞职信范文
2015/03/02 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL