我使用 tensorflow ops 编写了一个函数。我知道当我运行该函数时,它会向图中添加许多操作。但我对如何访问这些操作感到困惑。例如:def assign_weights(): with tf.name_scope('zheng'): v = tf.Variable(0, 'v', dtype=tf.float32) b = tf.placeholder(tf.float32, shape=()) z = tf.assign(v, b) return z, b仅当我设置为返回值时,我才能使用feed_dict将a值传递给。否则无法访问。如果我们想访问函数范围内的许多操作,我们应该设置许多返回值。这是非常丑陋的。bbb我想知道当我使用 tensorflow 运行函数时会发生什么,以及如何访问函数作用域中的操作。
2 回答
www说
TA贡献1775条经验 获得超8个赞
显然,要访问操作(或张量),我们确实需要对它进行一些引用。恕我直言,一种标准的解决方法是在类中构建图形并创建类的某些张量属性并通过对象访问它们。
或者,如果您更倾向于函数式方法,那么比分别返回所有相关操作和张量更好的方法是返回 dict(或命名元组)。
此外,还有一些专门的函数可以按名称返回操作:例如get_operation_by_name
.
作为这个问题的旁白,您可能还想尝试急切执行,这是必不可少的。
汪汪一只猫
TA贡献1898条经验 获得超8个赞
使用 op 函数时会发生 3 件事:
创建计算节点并将其添加到默认图中
将您的输入设置为节点输入张量
将节点输出张量设置为返回值
例如a = tf.add(b, c, name='add')
,
将带有 op 的节点添加
Add
到默认图形中,名称为“add”将 b 和 c 设置为节点输入张量
将名称为“add:0”的节点输出设置为
所以你可以通过 访问节点sess.graph
,有很多函数可以访问节点,比如 get_operation_by_name。
此外,您可以通过sess.graph_def
protobuf 序列化图来操作图,您可以在 tensorflow 源代码中找到 protobuf 定义,在那里可以找到tensorflow/core/framework
一些 .proto 文件。
添加回答
举报
0/150
提交
取消