当我使用tensorflow操作编写函数时会发生什么

问题描述 投票:1回答:2

我使用tensorflow操作编写一个函数。我知道当我运行该函数时,它会向图中添加许多操作。但我对如何访问这些操作感到困惑。

例如:

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_dicta值传递给b,前提是我将b设置为返回值。否则,无法访问b。如果我们想要在函数范围中访问许多操作,我们应该设置许多返回值。这非常难看。

我想知道当我使用tensorflow运行函数以及如何在函数范围内访问ops时会发生什么。

谢谢!

python tensorflow
2个回答
1
投票

显然,要访问op(或张量),我们需要对它进行一些引用。恕我直言,一个标准的解决方法是在类中构建图形并创建类的某些张量属性并通过对象访问它们。

或者,如果你更倾向于功能方法,那么比分别返回所有相关操作和张量更好的方法是返回一个dict(或namedtuple)。

此外,还有一些通过名称返回操作的专用函数:例如get_operation_by_name

除了这个问题,您可能还想尝试eager execution,这是必要的。


0
投票

使用op函数时会发生3件事:

  • 创建计算节点并将其添加到默认图表
  • 将输入设置为节点输入张量
  • 将节点输出张量设置为返回值

例如,a = tf.add(b, c, name='add')

  • 使用op Add将节点添加到默认图表,名称为“add”
  • 将b和c设置为节点输入张量
  • 将节点输出(名称为“add:0”)设置为a

所以你可以通过sess.graph访问节点,有很多函数可以访问节点,比如get_operation_by_name。

此外,您可以通过sess.graph_def操作图形,这是使用protobuf的序列化图形,您可以在tensorflow源代码中找到protobuf定义,tensorflow/core/framework,一些.proto文件。

© www.soinside.com 2019 - 2024. All rights reserved.