TensorFlow层次结构中的三种计算图

三种计算图

所谓计算图,计算图由节点(nodes)和线(edges)组成。节点表示操作符 Operator,或者称之为算子,线表示计算间的依赖。实线表示有数据传递依赖,传递的数据即张量。虚线通常可以表示控制依赖,即执行先后顺序。

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

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

静态计算图

在 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 为了确保对老版本 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)
 

动态计算图

在 TensorFlow 2.0 中,使用的是动态计算图和 Autograph。在 TensorFlow1.0 中,使用静态计算图分两步,第一步定义计算图,第二步在会话中执行计算图。

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

# 动态计算图在每个算子处都进行构建,构建后立即执行x = tf.constant("hello")
y = tf.constant("world")
z = tf.strings.join([x,y],separator=" ")tf.print(z)# 可以将动态计算图代码的输入和输出关系封装成函数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)

签名

动态计算图运行效率相对较低。可以用 @tf.function 装饰器将普通 Python 函数转换成和 TensorFlow1.0 对应的静态计算图构建代码。在 TensorFlow1.0 中,使用计算图分两步,第一步定义计算图,第二步在会话中执行计算图。在 TensorFlow2.0 中,如果采用 Autograph 的方式使用计算图,第一步定义计算图变成了定义函数,第二步执行计算图变成了调用函数。

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

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)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 查看 AutoGraph:# 启动 tensorboard在jupyter中的魔法命令
%load_ext tensorboard# 启动tensorboard
%tensorboard --logdir ./data/autograph/
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/299955.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07 Vue3框架简介

文章目录 一、Vue3简介1. 简介2. 相关网站3. 前端技术对比4. JS前端框架5. Vue核心内容6. 使用方式 二、基础概念1. 创建一个应用2. 变量双向绑定(v-model)3. 条件控制(v-if)4. 数组遍历(v-for)5. 绑定事件…

第十五节TypeScript 接口

1、简介 接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要有由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。 2、接口的定义 interface interface_…

阿里云服务器记录

阿里云服务器记录 CentOS 8.4 64位 SCC版 CentOS 7.9 64位 SCC版 CentOS 7.9 64位 CentOS 7.9 64位 UEFI版 Alibaba Cloud Linux Anolis OS CentOS Windows Server Ubuntu Debian Fedora OpenSUSE Rocky Linux CentOS Stream AlmaLinux 阿里云服务器有个scc版,这个…

Qt Creator可视化交互界面exe快速入门2

上一期介绍的通过代码的方式实现一个简单界面,需要敲小几十行代码,显然是效率低的,这期就介绍下Qt Creator的作用。 Qt Creator的使用: 首先打开我们的Qt Creator 然后点击创建项目,在项目Application里面选择Qt Wid…

分享71个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 链接:https://pan.baidu.com/s/1frK-W3GT8WrydSlQ-E3o6A?pwd6666 提取码:6666 UI代码 def __init__(self):import …

VMware vcenter6.7安装(基于windows客户端)

一、下载vcenter6.7 1.下载地址,直接复制粘贴到web回车即可,这一步就不截图了。 从官网或者百旺网盘(可以自行搜索,或者私信我要) 二、安装部署vcenter6.7 将下载好的镜像文件拷贝到一台Windows机器上,…

《Cesium 基础知识点》- 相机最近和最远距离设置

设置 /* 注意 enableCollisionDetection 必须是 true 才有效 */// 最近视距,默认值 1,单位为米 viewer.scene.screenSpaceCameraController.minimumZoomDistance 1; // 最远视距,默认值正无穷大 Number.POSITIVE_INFINITY viewer.scene.scr…

三相电机转差率为负值的情形

1.电机开始发电的特征 注意,电机因为有输入频率对原始旋转磁场的影响,在正常工作时,应该处于稳态,因为旋转磁场决定了这个系统的运转方向和运转的大致频率区间。它会处于力矩平衡态。但是,如果,此时电机处…

windows浏览器连不上网络,但微信、qq可以,诊断网络显示 dns问题

一开始跟着网上一堆教程,什么ipconfig之类的,重启什么之类的都没解决。 后面自己重新设置了一下DNS地址,遇到相关问题的也可以试试(但不知道是不是需要叠加前面网上很多的ipconfig 叭叭叭类的设置)。 具体为 控制面板…

AGV|RGV小车RFID传感器CNS-RFID-01/1S的RS232通讯联机方法

CNS-RFID-01/1S广泛应用于AGV小车,搬运机器人,无人叉车等领域,用于定位,驻车等应用,可通过多种通讯方式进行读写操作,支持上位机控制,支持伺服电机,PLC等控制设备联机,本…

关于Smartbi登录代码逻辑漏洞的动态情报

一、基本内容 近日,思迈特软件核查发现存在“登录代码逻辑漏洞”问题,重点影响范围涉及Smartbi V9及其以上版本。该漏洞可能导致攻击者利用逻辑缺陷对目标系统进行攻击,造成敏感信息泄露和远程代码执行的风险。 二、相关发声情况 Smartbi是…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…