《面向机器智能的TensorFlow实践》一3.3 通过名称作用域组织数据流图

简介:

本节书摘来自华章出版社《面向机器智能的TensorFlow实践》一书中的第3章,第3.3节,作者 山姆·亚伯拉罕(Sam Abrahams)丹尼亚尔·哈夫纳(Danijar Hafner)[美] 埃里克·厄威特(Erik Erwitt)阿里尔·斯卡尔皮内里(Ariel Scarpinelli),更多章节内容可以访问云栖社区“华章计算机”公众号查看。





3.3 通过名称作用域组织数据流图

现在开始介绍构建任何TensorFlow数据流图所必需的核心构件。到目前为止,我们只接触了包含少量节点和阶数较小的张量的非常简单的数据流图,但现实世界中的模型往往会包含几十或上百个节点,以及数以百万计的参数。为使这种级别的复杂性可控,TensorFlow当前提供了一种帮助用户组织数据流图的机制—名称作用域(name scope)。

名称作用域非常易于使用,且在用TensorBoard对Graph对象可视化时极有价值。本质上,名称作用域允许将Op划分到一些较大的、有名称的语句块中。当以后用TensorBoard加载数据流图时,每个名称作用域都将对其自己的Op进行封装,从而获得更好的可视化效果。名称作用域的基本用法是将Op添加到with tf.name_scope(<name>)语句块中。

 

 

为了在TensorBoard中看到这些名称作用域的效果,可打开一个SummaryWriter对象,并将Graph对象写入磁盘。

 

由于SummaryWriter对象会将数据流图立即导出,可在运行完上述代码便启动TensorBoard。导航到运行上述脚本的路径,并启动TensorBoard:

 

与之前一样,上述命令将会在用户的本地计算机启动一个端口号为6006的TensorBoard服务器。打开浏览器,并在地址栏键入localhost:6006,导航至“Graph”标签页,用户将看到类似于下图的结果。

 

我们添加到该数据流图中的add和mul Op并未立即显示出来,所看到的是涵盖它们的命名作用域。可通过单击位于它们右上角的“+”图标将名称作用域的方框展开。

 

在每个作用域内,可看到已经添加到该数据流图中的各个Op,也可将名称作用域嵌入在其他名称作用域内:

 

 

上述代码并未使用默认的Graph对象,而是显式创建了一个tf.Graph对象。下面重新审视这段代码,并聚焦于命名作用域,了解其组织方式:

 

现在对上述代码进行分析就更加容易。这个模型拥有两个标量占位节点作为输入,一个TensorFlow常量,一个名为“Transformation”的中间块,以及一个使用tf.maximum()作为其Op的最终输出节点。可在TensorBoard内看到这种高层的表示:

 

 

 

在Transformation名称作用域内有另外4个命名空间被安排到两个“层”中。第一层由作用域“A”和“B”构成,该层将A和B的输出传给下一层“C”和“D”。最后的节点会将来自最后一层的输出作为其输入。在TensorBoard中展开Transformation名称作用域,将看到类似下图的效果。

 

这同时还赋予了我们一个展示TensorBoard另外一个特性的机会。在上图中,可发现名称作用域“A”和“B”的颜色一致(蓝色),“C”和“D”的颜色也一致(绿色)。这是因为在相同的配置下,这些名称作用域拥有相同的Op设置,即“A”和“B”都有一个tf.mul() Op传给一个tf.sub() Op,而“C”和“D”都有一个tf.div() Op传给tf.add() Op。如果开始用一些函数创建重复的Op序列,将会非常方便。

 

在上图中可以看到,当在TensorBoard中显示时,tf.constant对象的行为与其他Tensor对象或Op并不完全相同。即使我们没有在任何名称作用域内声明static_value,它仍然会被放置在这些名称作用域内,而且,static_value并非只出现一个图标,它会在被使用时创建一个小的视觉元素,其基本思想是常量可在任意时间使用,且在使用时无须遵循任何特定顺序。为防止在数据流图中出现从单点引出过多箭头的问题,只有当常量被使用时,它才会以一个很小的视觉元素的形式出现。

将一个规模较大的数据流图分解为一些有意义的簇能够使对模型的理解和编译更加方便。

相关文章
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
465 0
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
50 1
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
72 0
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
133 0
【人工智能】TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
TensorFlow是由Google Brain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(Computation Graph),这是一种用于表示计算流程的图结构,由节点(代表操作)和边(代表数据流)组成。
116 0
构建高效的机器学习模型:基于Python和TensorFlow的实践
构建高效的机器学习模型:基于Python和TensorFlow的实践
90 0
TensorFlow在自然语言处理中的实践
【4月更文挑战第17天】本文探讨了TensorFlow在自然语言处理(NLP)中的应用,包括文本预处理、特征表示、模型构建、训练与评估。TensorFlow提供工具简化文本预处理,如`tf.text`模块进行分词。利用`Tokenizer`和`to_categorical`进行特征表示。通过`Embedding`、`LSTM`等构建模型,并用`model.fit`和`model.evaluate`训练及评估。实践中,可借助预训练词嵌入、序列填充、注意力机制和迁移学习提升性能。TensorFlow为NLP任务提供了高效解决方案,未来潜力无限。
NumPy与TensorFlow/PyTorch的集成实践
【4月更文挑战第17天】本文探讨了NumPy与主流深度学习框架TensorFlow和PyTorch的集成实践,阐述了它们如何通过便捷的数据转换提升开发效率和模型性能。在TensorFlow中,NumPy数组可轻松转为Tensor,反之亦然,便于原型设计和大规模训练。PyTorch的张量与NumPy数组在内存中共享,实现无缝转换。尽管集成带来了性能和内存管理的考量,但这种结合为机器学习流程提供了强大支持,促进了AI技术的发展。
【TensorFlow】TF介绍及代码实践
【4月更文挑战第1天】TF简介及代码示例学习
116 0
YOLO实践应用之搭建开发环境(Windows系统、Python 3.8、TensorFlow2.3版本)
基于YOLO进行物体检测、对象识别,先和大家分享如何搭建开发环境,会分为CPU版本、GPU版本的两种开发环境,本文会分别详细地介绍搭建环境的过程。主要使用TensorFlow2.3、opencv-python4.4.0、Pillow、matplotlib 等依赖库。
343 0