为什么TensorFlow为部分变量生成ReadVariableOp,其余变量却没有?
问题描述
我正在参照TensorFlow官方教程学习TensorBoard的Graphs仪表板功能,运行的代码如下:
@tf.function def compute_j(a, b, c): J = 3*(a+b*c) return J # Set up logging. stamp = datetime.now().strftime("%Y%m%d-%H%M%S") logdir = 'logs/func/%s' % stamp writer = tf.summary.create_file_writer(logdir) tf.summary.trace_on(graph=True, profiler=True) a = tf.Variable(5.0) b = tf.Variable(3.0) c = tf.Variable(2.0) compute_j(a, b, c).numpy() with writer.as_default(): tf.summary.trace_export( name="my_func_trace", step=0, profiler_outdir=logdir)
运行后得到的计算图如下:
请问为什么TensorFlow为红框标注的变量a和b生成了ReadVariableOp,却没有为变量c生成对应的ReadVariableOp呢?
问题解答
这个现象是TensorFlow的图优化机制和TensorBoard的概念图可视化规则共同导致的,具体原因如下:
ReadVariableOp是TensorFlow中用于读取tf.Variable存储值、将其转换为可参与计算的Tensor类型的必要算子,你的三个变量在实际执行阶段都会触发该操作,不存在c没有对应读操作的情况。- 你当前在TensorBoard中查看的是概念图(Conceptual Graph),属于官方做过简化的可视化视图,目的是降低计算图的理解门槛,会默认将和后续计算算子高度绑定的低层级操作折叠到上层节点中,不会单独展示。
- 你代码中
b * c对应的乘法算子Mul在图优化阶段和变量c的ReadVariableOp做了算子融合,因此c的读操作被整合进了乘法节点内部,没有出现在顶层视图中,你只要点击展开乘法节点就能看到隐藏的ReadVariableOp。 - 变量a的读操作后接的是加法算子,算子融合优先级低于乘法和读操作的融合,变量b的读操作没有被融合则是优化策略的优先级决策,二者的读操作没有被绑定到后续计算节点,因此单独显示在了顶层视图中。
如果你切换到TensorBoard的全量执行图(Full Execution Graph)视图,就能清晰看到三个变量都有对应的独立ReadVariableOp节点。
内容的提问来源于stack exchange,提问作者JJJohn
相关产品推荐
相关产品推荐

