TensorFlow计算图核心机制:从构建到会话执行详解
本文深入解析TensorFlow的核心机制,涵盖计算图的构建与执行流程。详细阐述如何通过Context Manager建立Graph,利用Session启动Op并分发至硬件设备。重点讲解Fetches参数在run()中的应用,以及Variable状态管理、初始化方法及与Optimizer的交互,帮助开发者掌握模型训练的基础架构。
计算图
在 TensorFlow 框架中,计算任务通过计算图进行建模。计算图本质上是一种有向图结构,用于定义计算的逻辑关系,它实际上是由一系列函数组合而成的运算网络。借助这种图形化的表示方式,用户能够利用简单且直观的数学函数组件,构建出复杂的运算逻辑。
在 TensorFlow 中使用计算图主要包含两个步骤:首先是建立计算图,其次是执行该图。
从形式上看,计算图由节点(Nodes)和边(Edges)两部分组成。节点以圆圈表示,代表对数据执行的具体计算或操作(Operation);边以箭头表示,用于在操作之间传递实际的数据值(Tensor)。
建立图
graph = tf.Graph()
访问上下文管理器
with graph.as_default():
使用 with 语句可以调用上下文管理器(context manager),以此告知 TensorFlow 当前正在向特定的 Graph 添加操作(Op)。
计算图的执行必须在会话(Session)中启动。会话负责将图中的操作分发到 CPU 或 GPU 等硬件设备上,并提供执行这些操作的方法。执行完成后,会话会将产生的张量(tensor)返回给用户。
## 开启session
sess = tf.Session()`
一旦会话(Session)被开启,即可通过调用 run() 方法来计算所需 Tensor 的值。
使用完会话后,务必记得关闭它以释放资源。
sess.close()
Fetches
fetches 是 session.run() 方法的一个参数,它可以接收任何需要执行的 Op 或 Tensor,以及它们组成的列表结构。
- 如果传入的是 tensor,那么 session.run() 的输出将是一个 Numpy 数组。
- 如果传入的是 Op,那么 session.run() 的输出通常为 None。
例如:sess.run(b) 会指示 Session 找到计算 b 所需的所有节点,按顺序执行并输出结果。
全局变量初始化
tf.global_variables_initializer()
该操作表示将所有定义的 Variable 变量准备就绪,以便后续使用。此 Op 也可以传递给 session.run() 执行。例如:
init = tf.global_variables_initializer() … sess.run(init)
张量Tensor和OP
在 TensorFlow 中,使用 tensor 来表示所有数据结构,计算图中操作(Op)节点之间传递的均为 Tensor。
- 定义 tensor 时可以直接使用 numpy 传递给 Op 节点,因为 TensorFlow 的 Op 能够将 Python 的数据类型转化为 tensor,包括 numbers、booleans、strings 或者 list。
- 图中的任何节点都称为 Operation,简称 Op。
- 每个 Op 的输出会被传递到其他 Op 或者 sess.run()。
Variable
Variable(变量)用于维护图执行过程中的状态信息,需要它来保持和更新参数数值,这些数值是需要动态调整的。
- Tensor 和 Operation 都是一成不变的,而 Variable 是可以随着时间改变的。
- Variable 可以用在任何使用 tensor 的 Op 中,它当前的值就会被传递给使用它的 Op。
- Variable 通常的初始值是一些很大的 0、1 或者随机值 tensor,或者内置 op:tf.zeros(),tf.ones() 等。
- Variable 在 graph 中,状态由 session 管理,也是在 session 中进行初始化,session 可以追踪 variable 的当前值是多少。
- session 可以只初始化一部分 variable。
- 使用 tf.variables_initializer,传入初始化变量列表。
- variable 的值是可以被改变的。
- 比如使用 variable.assign(variable),或者variable.assign_add(1)。
- 每个 session 维护独立的 variable 变量值,同一个 variable 不同的 session 值可以是不同的。
- 当各种 Optimizer 优化器训练机器学习模型时,variable 就会随之改变,当使用 variable 中的 trainable=False 属性可以不被 Optimizer 改变。
name_scopes
- name_sopes 可以用来管理图,可以把一组 Op 放到一个组块中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













