热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅入浅出TensorFlow9代码框架解析

一.TensorFlow源码截止到目前为止,TensorFlow在【Github】的Contributors已经接近900人,Fork30000次。学习这么庞大的开源项目,首先必须

一. TensorFlow 源码

截止到目前为止,TensorFlow 在 【Github】 的 Contributors 已经接近900人,Fork 30000次。

学习这么庞大的开源项目,首先必须要搞清楚其代码组织形式,我们先来看目录结构:

《浅入浅出TensorFlow 9 - 代码框架解析》
《浅入浅出TensorFlow 9 - 代码框架解析》

Project 目录分为4个:

1)tensorflow

核心代码目录,图中可以看到其子目录结构,后面我们会展开讲解。

2)third_party

第三方库,包括:eigen3,fft2d,hadoop,mkl,probuf 等。

3)tools

只有两个文件 bazel.rc 和 tf_env_collect.sh。

4)util/python

存放用到的 python 工具。

另外一个比较重要的文件是 configure,用于配置 tensorflow 的安装环境。

对于 tensorflow 核心目录,里面比较关键的几个模块:

1.1)core

这是 tensorflow 的核心代码模块.

1.2)tensorboard

不用解释,应该都清楚,这是可视化工具 tensorboard 的代码目录。

1.3)stream_executor

tensorflow 流图的并行计算执行,核心代码。

1.4)go,java,python

主要的第三方 API。

1.5)contrib

存放有其他项目贡献者添加的相关贡献代码,非核心官方代码,有具体方向的应用可以参考这里面的模块。

《浅入浅出TensorFlow 9 - 代码框架解析》
《浅入浅出TensorFlow 9 - 代码框架解析》

二. 核心代码目录 Core

Core 目录是代码最核心的部分,包含 框架、图、会话、runtime 最核心的部分,主要模块包括:

● common_runtime:公共运行库,包含 会话(session)、线程(thread),内存管理(memory), 设备调度(device)等基本运行库。

● distributed_runtime:分布式运行库,与上面类似,作为分布式情况下的运行库,提供运行支撑。

● framework:框架基础模块定义,主要是通用组件的结构格式定义;

● graph:计算流图相关基础操作(类结构),包括 拆分、合并、执行 等操作,被外面的 executor 调用;

● kernels:核心操作定义,像常用的运算 matmul,sigmoid 等操作;

● lib:基础库用于内部调用,包括 hash、io、jpeg、math 等;

● ops:对 kernel 下的op进行注册和对外声明;

● protobuf:Google 的传输交换模块,用于传输时的数据序列化;

三. Graph 与 Session

关于 Graph 和 Session 前面已经有篇幅讲过,概念上可能大家并没有完全理解,本篇再讲一下。

● Graph

首先搞清一个概念,Graph 是 Tensorflow 必须要存在的,是灵魂核心,你所看到的任何一个 图都是通过 Graph来组织的。

《浅入浅出TensorFlow 9 - 代码框架解析》

再来看一段你已经很熟悉的代码:

>>> import tensorflow as tf
>>> str = tf.constant("Hello World!")
>>> se = tf.Session()
>>> print se.run(str)

没看到 Graph 的创建对不对? 实际上在你创建 Session 的时候,系统自动为你创建了一个 默认Graph,用于接下来所有 OP 的组织和存放。

某些情况下,你可以同时维护两个以上的 Graph,比如我们经常会遇到这样一句, tf.Graph.as_default()

curr_graph = tf.Graph()
with curr_graph.as_default():
c_val = tf.constant(1.0)
assert c_val.graph is curr_graph

在定义 OP 操作的时候可以选择Graph 作为 default,那么你所创建的 OP 就建立在对应 Graph 下面了。

● Session

TensorFlow 的 Session 用法你可能比较熟了,来回顾一下:

# method 1
sess = tf.Session()
print sess.run()
sess.close()
# method 2
with tf.Session() as sess:
print sess.run()
# method 3 - 仅用于交互式环境
sess = tf.InteractiveSession()
a = tf.constant(1.0)
b = tf.constant(2.0)
c = a + b
# 我们直接使用'c.eval()' 而不是'sess.run'
print(c.eval())
sess.close()

对于 Graph 和 Session 的关系,需要记住,Graph 可以在对应多个 Session 中执行。


推荐阅读
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
author-avatar
jerry827900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有