2-2 三种计算图

有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph.

在TensorFlow1.0时代,采用的是静态计算图,需要先使用TensorFlow的各种算子创建计算图,然后再开启一个会话Session,显式执行计算图。

而在TensorFlow2.0时代,采用的是动态计算图,即每使用一个算子后,该算子会被动态加入到隐含的默认计算图中立即执行得到结果,而无需开启Session。

使用动态计算图即Eager Excution的好处是方便调试程序,它会让TensorFlow代码的表现和Python原生代码的表现一样,写起来就像写numpy一样,各种日志打印,控制流全部都是可以使用的。

使用动态计算图的缺点是运行效率相对会低一些。因为使用动态图会有许多次Python进程和TensorFlow的C++进程之间的通信。而静态计算图构建完成之后几乎全部在TensorFlow内核上使用C++代码执行,效率更高。此外静态图会对计算步骤进行一定的优化,剪去和结果无关的计算步骤。

如果需要在TensorFlow2.0中使用静态图,可以使用@tf.function装饰器将普通Python函数转换成对应的TensorFlow计算图构建代码。运行该函数就相当于在TensorFlow1.0中用Session执行代码。使用tf.function构建静态图的方式叫做 Autograph.

一,计算图简介

计算图由节点(nodes)和线(edges)组成。

节点表示操作符Operator,或者称之为算子,线表示计算间的依赖。

实线表示有数据传递依赖,传递的数据即张量。

虚线通常可以表示控制依赖,即执行先后顺序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgJahy3u-1660975319432)(./data/strjoin_graph.png)]

二,静态计算图

在TensorFlow1.0中,使用静态计算图分两步,第一步定义计算图,第二步在会话中执行计算图。

TensorFlow 1.0静态计算图范例

import tensorflow as tf#定义计算图
g = tf.Graph()
with g.as_default():#placeholder为占位符,执行会话时候指定填充对象x = tf.placeholder(name='x', shape=[], dtype=tf.string)  y = tf.placeholder(name='y', shape=[], dtype=tf.string)z = tf.string_join([x,y],name = 'join',separator=' ')#执行计算图
with tf.Session(graph = g) as sess:print(sess.run(fetches = z,feed_dict = {x:"hello",y:"world"}))

TensorFlow2.0 怀旧版静态计算图

TensorFlow2.0为了确保对老版本tensorflow项目的兼容性,在tf.compat.v1子模块中保留了对TensorFlow1.0那种静态计算图构建风格的支持。

可称之为怀旧版静态计算图,已经不推荐使用了。

import tensorflow as tfg = tf.compat.v1.Graph()
with g.as_default():x = tf.compat.v1.placeholder(name='x', shape=[], dtype=tf.string)y = tf.compat.v1.placeholder(name='y', shape=[], dtype=tf.string)z = tf.strings.join([x,y],name = "join",separator = " ")with tf.compat.v1.Session(graph = g) as sess:# fetches的结果非常像一个函数的返回值,而feed_dict中的占位符相当于函数的参数序列。result = sess.run(fetches = z,feed_dict = {x:"hello",y:"world"})print(result)
b'hello world'

三,动态计算图

在TensorFlow2.0中,使用的是动态计算图和Autograph.

在TensorFlow1.0中,使用静态计算图分两步,第一步定义计算图,第二步在会话中执行计算图。

动态计算图已经不区分计算图的定义和执行了,而是定义后立即执行。因此称之为 Eager Excution.

Eager这个英文单词的原意是"迫不及待的",也就是立即执行的意思。

# 动态计算图在每个算子处都进行构建,构建后立即执行x = tf.constant("hello")
y = tf.constant("world")
z = tf.strings.join([x,y],separator=" ")tf.print(z)
hello world
# 可以将动态计算图代码的输入和输出关系封装成函数def strjoin(x,y):z =  tf.strings.join([x,y],separator = " ")tf.print(z)return zresult = strjoin(tf.constant("hello"),tf.constant("world"))
print(result)
hello world
tf.Tensor(b'hello world', shape=(), dtype=string)

四,TensorFlow2.0的Autograph

动态计算图运行效率相对较低。

可以用@tf.function装饰器将普通Python函数转换成和TensorFlow1.0对应的静态计算图构建代码。

在TensorFlow1.0中,使用计算图分两步,第一步定义计算图,第二步在会话中执行计算图。

在TensorFlow2.0中,如果采用Autograph的方式使用计算图,第一步定义计算图变成了定义函数,第二步执行计算图变成了调用函数。

不需要使用会话了,一些都像原始的Python语法一样自然。

实践中,我们一般会先用动态计算图调试代码,然后在需要提高性能的的地方利用@tf.function切换成Autograph获得更高的效率。

当然,@tf.function的使用需要遵循一定的规范,我们后面章节将重点介绍。

import tensorflow as tf# 使用autograph构建静态图@tf.function
def strjoin(x,y):z =  tf.strings.join([x,y],separator = " ")tf.print(z)return zresult = strjoin(tf.constant("hello"),tf.constant("world"))print(result)
hello world
tf.Tensor(b'hello world', shape=(), dtype=string)
import datetime# 创建日志
import os
stamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
logdir = os.path.join('data', 'autograph', stamp)## 在 Python3 下建议使用 pathlib 修正各操作系统的路径
# from pathlib import Path
# stamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
# logdir = str(Path('./data/autograph/' + stamp))writer = tf.summary.create_file_writer(logdir)#开启autograph跟踪
tf.summary.trace_on(graph=True, profiler=True) #执行autograph
result = strjoin("hello","world")#将计算图信息写入日志
with writer.as_default():tf.summary.trace_export(name="autograph",step=0,profiler_outdir=logdir)
#启动 tensorboard在jupyter中的魔法命令
%load_ext tensorboard
#启动tensorboard
%tensorboard --logdir ./data/autograph/

当然现在,有更新了,显示的图的路径会更大,并且分开显示,也可以在在线的colab体验一下代码的结果

《30天吃掉那只 TensorFlow2.0》 2-2 三种计算图相关推荐

  1. 《30天吃掉那只 TensorFlow2.0》 开篇辞(Tensorflow 学习之路)

    <30天吃掉那只 TensorFlow2.0 >开篇辞

  2. 《30天吃掉那只 TensorFlow2.0 》(附下载)

    本书面向读者  本书假定读者有一定的机器学习和深度学习基础,使用过Keras或者Tensorflow1.0或者Pytorch搭建训练过模型. 对于没有任何机器学习和深度学习基础的同学,建议在学习本书时 ...

  3. 重磅开源!《30天吃掉那只 TensorFlow2.0 》(附下载)

    本书面向读者  本书假定读者有一定的机器学习和深度学习基础,使用过Keras或者Tensorflow1.0或者Pytorch搭建训练过模型. 本书写作风格 本书是一本对人类用户极其友善的TensorF ...

  4. 《30天吃掉那只 TensorFlow2.0》 1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题)

    1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题) 文章目录 1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题) 一,准备数据 二,定义模型 三,训练模型 四,评估模型 ...

  5. 30天吃掉那只tensorflow之(2):使用 cifar10 数据集来训练网络并测试

    文章目录 写在前头 1. Cifar10数据集的介绍.获取 2. 训练集数据可视化 3. 简单数据处理:将标签进行 one-hot 编码转换 4. 构建网络模型 5. 模型训练 6. 训练数据可视化 ...

  6. 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。 是否AC的规则如下: 1. zoj能AC; 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;

    对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下: 1. zoj能AC: 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空: ...

  7. 假设一个录像厅有0,1,2三种不同的录像片可由观众选择放映。录像厅的放映规则为: 1)任何时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的。最后一个观众主动离开时结束当前录像片的放映。

    录像厅问题 假设一个录像厅有0,1,2三种不同的录像片可由观众选择放映.录像厅的放映规则为: 1)任何时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的.最后一个观众主动离开时结束当前录像片 ...

  8. php 三色排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,第2章 排序 | | 第17节 三色排序练习题...

    1.思路: 1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了.第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则coun ...

  9. vue2.0模板的三种写法

    vue2.0中的模板有三种写法,根据不同的需求运用不同的方法来实现 1. <!DOCTYPE html> <html lang="en"> <head ...

最新文章

  1. Visual C++ 2011-8-15
  2. java tomcat监控_java-jvisualvm远程监控tomcat
  3. jQuery基础---filter()和find()
  4. 怎么样条件需要做屏蔽机房,屏蔽机房建设标准是什么?
  5. Unable to resolve target 'android-5'
  6. 电脑小写字母怎么切换_电脑上也可以使用九州音集啦!
  7. 使用Express开发小说API接口服务1.0(二)
  8. php创建表的返回值,php 判断table 是否存在 根据返回值继续下一步的操作
  9. 你拿苹果技术顾问怎么办?
  10. 使用ApiPost按顺序传参及测试多个接口
  11. 地产行业主数据建设项目思考
  12. 在ArrayLIst和LinkedList尾部加元素,谁的效率高
  13. 一、对文本文件进行数据粒度转换,即将文本文件personnel_data.txt中字段household_register的数据统一成省份,并且输出到文本文档personnel_data_new.tx
  14. 有没有测试牙齿需不需要修正的软件,小虎正畸:测一测你到底需不需要进行牙齿矫正?...
  15. 次世代教程——美队盾牌雕刻
  16. 加载R包unloadNamespace时,我该怎么办
  17. PB EXCEL导入
  18. Python scrapy框架快速入门
  19. 用于链接预测的邻域重叠感知图神经网络
  20. 三元赫尔德不等式_赫尔德不等式

热门文章

  1. JAVA缴税_纳税服务系统【总结】
  2. 论文复现:WS-DAN细粒度分类问题经典之作
  3. 关于NS2多接口多信道扩展方案
  4. libx264编码过程中修改码率踩坑记录
  5. 逻辑学学习.10 --- 谓词逻辑(二):一般命题的符号化
  6. android Cannot access com.xxx
  7. 如何利用工时表来帮助项目管理做得更完善?
  8. AVAST 8.0网络版 提示我是盗版用户,为何还能升级更新?
  9. 如何做流程图?这几个实用的制作流程图方法分享给你
  10. 实现摄像头在内网、外网、gb28181 实现 “视频监控/直播” 的常用几种方式