tensorflow码源-运行流程

2023-11-10

tensorflow码源-运行流程

简介

通过分析用户构建的计算是如何在tensorflow中运行的,了解tensorflow中的基本元素和op、kernel和device之间的交互。

用户程序

matrix1 = tf.constant([[3., 3.]]
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
with tf.Session() as sess:
  result = sess.run([product])
  print(result)

如何构建计算流图的

Op的注册

tensroflow中的计算流图中的节点被称为ops,只记录了计算的节点的属性。计算有绑定该op的kernel来实现。
在python中,op等的注册实际上是有C++实现自动生成的。对于matmul属于math,它的注册在gen_math_ops.py(源码中看不到,需要在生成的python包中找)。
注册的ops保存在OpDefLibrary类型的实例_op_def_lib中,_op_def_lib在初始化阶段会接收一个op_list,其中包含了各math ops的定义。

def _InitOpDefLibrary():
op_list = _op_def_pb2.OpList()
_text_format.Merge(_InitOpDefLibrary.op_list_ascii, op_list)
_op_def_registry.register_op_list(op_list)
op_def_lib = _op_def_library.OpDefLibrary()
op_def_lib.add_op_list(op_list)
return op_def_lib

_InitOpDefLibrary.op_list_ascii = """op {
3072 name: "Abs"
3073 input_arg {
3074 name: "x"
3075 type_attr: "T"
3076 }
3077 output_arg {
3078 name: "y"
3079 type_attr: "T"
3080 }
3081 attr {
3082 name: "T"
3083 type: "type"
3084 allowed_values {
3085 list {
3086 type: DT_HALF
3087 type: DT_FLOAT
3088 type: DT_DOUBLE
3089 type: DT_INT32
3090 type: DT_INT64
3091 }
3092 }
3093 }
3094 }
.."

_op_def_lib = _InitOpDefLibrary()
//_op_def_registry.register_op_list(op_list)对应的是
tensorflow.core.framework.op_def_registry.register_op_list
//会把op有注册到到_registered_ops = {}中,可以通过get_registered_ops()获取
//两着的本质应该是一样的,用的地方应该不一样,
//_op_def_lib用于构建计算的图?
//_registered_ops 用于其他?
在C++中也有类似的过程,实现在C++中op的注册
MatMul的在 core/ops/math_ops.cc::1021

插入op到graph

tf.matmul等函数会在图中插入我们给定的操作。这些操作最终都会转化成
def matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None): #tensorflow.python.ops.math_ops
  return gen_math_ops._mat_mul( a, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)
#tensorflow.python.ops. gen_math_ops(生成的包中)
def _mat_mul(a, b, transpose_a=None, transpose_b=None, name=None)
  _op_def_lib.apply_op(“MatMul”,…)
#apply_op比较复杂,最终会在图中添加该op
331 g = ops._get_graph_from_inputs(_Flatten(keywords.values()))
...
# Add Op to graph
766 op = g.create_op(op_type_name, inputs, output_types, name=scope,
767 input_types=input_types, attrs=attr_protos,
768 op_def=op_def)
return op

#如果参数没有提供图,则会在当前线程默认的图中添加操作。
#def get_graph_from_inputs(op_input_list, graph=None):
#  """Returns the appropriate graph to use for the given inputs.
#  1. If `graph` is provided, we validate that all inputs in `op_input_list` are
#     from the same graph.
#  2. Otherwise, we attempt to select a graph from the first Operation- or</
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow码源-运行流程 的相关文章

随机推荐

  • 不用看网课就能学到python的文章(第一天)

    为什么要学python 在大数据时代 抖音快手火爆全球 作业帮小猿搜题的数据库 都离不开大数据 大数据的科学计算 最重要的语言就是python 网络爬虫 网络爬虫 搜狗百科 搜索引擎等等也主要是python 包括一些游戏图像等等都缺少不了p
  • Windows7在Eclipse中配置Python+OpenCV

    1 从http www oracle com technetwork java javase downloads jdk 7u2 download 1377129 html下载jdk 7u2 windows i586 exe 安装到D Pr
  • 简单介绍Roop(类似SimSwap)项目

    文章目录 一 关于Roop 二 安装Roop CPU 2 1 克隆仓库 2 2 设置python国内源 2 2 检查安装virtualenv 2 3 创建项虚拟环境 2 5 安装项目依赖 2 6 下载必要文件 三 运行Roop CPU 四
  • 论文解读《SOLO: Segmenting Objects by Locations》

    实例分割属于比较challenging的任务 他相当于是object detection和semantic segmentation的结合体 在SOLO出现之前 有两种常用的paradigm 1 top down 先进行目标检测 再对检测框
  • mysql中TINYINT的取值范围

    项目场景 最近在开发过程中 看见表设计中是thinyint字段 但对于它的范围产生了好奇 问题描述 当我们填写超过128数值的时候 该字段就会报以下错误 Cause com mysql jdbc MysqlDataTruncation Da
  • 62_Pandas有条件地提取 pandas.DataFrame 的行

    62 Pandas有条件地提取 pandas DataFrame 的行 使用query 方法根据pandas DataFrame的列值的条件提取行 它很方便 因为您可以使用比较运算符和字符串方法以及多个条件的组合来简洁地描述条件规范 目录
  • -bash: /etc/profile: line 11: syntax error near unexpected token `$'{\r''报错问题解决

    在Linux系统配置Java环境变量之后执行 source etc profile指令报 bash etc profile line 11 syntax error near unexpected token r 如下图 错误提示信息已经反
  • dlmalloc解析连载一

    dlmalloc是目前一个十分流行的内存分配器 其由Doug Lea 主页为 http gee cs oswego edu 从1987年开始编写 到目前为止 最新版本为2 8 3 可以从 ftp g oswego edu pub misc
  • 对计算机硬件维护的方法,计算机硬件维护方法

    计算机硬件维护方法 随着科技的不断发展 计算机应用率越来越高 在社会生活的各个领域均有广泛的应用 下面是小编分享的计算机硬件维护方法 一起来看一下吧 计算机常见的硬件故障主要包括内存条损坏 主板元器件损坏 硬盘损坏等 计算机硬件出现故障 一
  • 黑马程序员--分布式搜索ElasticSearch学习笔记

    写在最前 黑马视频地址 https www bilibili com video BV1LQ4y127n4 想获得最佳的阅读体验 请移步至我的个人博客 SpringCloud学习笔记 消息队列MQ学习笔记 Docker学习笔记 分布式搜索E
  • CENTOS环境Apache最新版本httpd-2.4.54编译安装

    一 下载 Apache至少需要apr apr util pcre组件的支持 cd usr local src wget http dlcdn apache org apr apr 1 7 0 tar gz wget http dlcdn a
  • 微信小程序心得体会

    1 微信小程序诞生的前景 1 受到手机内存的限制 用户无法下载诸多app 2 用户为了简洁性不愿意下载app 3 微信用户的日益增加 2 微信小程序的特点 微信小程序的理念是 触手可及 用完即走 是一种不需要下载安装即可使用的应用 一次开发
  • SpringBoot 项目健康检查与监控

    转载 https www cnblogs com javanoob p springboot healthcheck html 前言 You build it You run it 当我们编写的项目上线后 为了能第一时间知晓该项目是否出现问
  • 程序员必知的 七 种软件架构模式!

    一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模式 分层架构 多层架构 管道 过滤器架构 客户端 服务器架构 模型 视图 控制器架构 事件
  • 背包算法(贪婪算法)

    一 问题描述 有n 个物品 它们有各自的重量和价值 现有给定容量的背包 如何让背包里装入的物品具有最大的价值总和 二 总体思路 根据动态规划解题步骤 问题抽象化 建立模型 寻找约束条件 判断是否满足最优性原理 找大问题与小问题的递推关系式
  • PyQt界面:左右界面由于控件太多不协调

    问题 在编写软件时 有左右两个子界面 都设置为网格布局 左界面是菜单 右界面是每个菜单对应的内容 当右界面的空间太多时 导致左界面的空间缩小 不协调 正常显示应如下 如下图 右边的一行控件太多 导致子界面左边界面宽度变窄 影响整体协调性 解
  • python熵权法过程中,权重出现nan值问题

    最近在利用熵权法选取最优指标数据时 计算权重得到的是全为nan值的权重 经过分析过程 找到问题所在 数据展示 熵权法步骤 step 1 标准化处理 step 2 计算每个维度的信息熵 step 3 差异系数 step 4 计算权重 step
  • Altium Designer 21的使用(二):电阻电容模型的创建

    TIPS 元件符号是元件在原理图上的表现形式 主要由元件边框 管脚 包括管脚序号和管脚名称 元件名称及元件说明组成 通过放置的管脚来建立电气连接关系 元件符号中的管脚序号是和电子元件实物的管脚一一对应的 在创建元件时 图形不一定和实物完全一
  • java io流读取文件_java的几种IO流读取文件方式

    一 超类 字节流 InputStream 读入流 OutputStream 写出流 字符流 Reader 字符 读入流 Writer 字符写出流 二 文件操作流 字节流 FileInputStream FileOutputStream 字符
  • tensorflow码源-运行流程

    tensorflow码源 运行流程 简介 通过分析用户构建的计算是如何在tensorflow中运行的 了解tensorflow中的基本元素和op kernel和device之间的交互 用户程序 matrix1 tf constant 3 3