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

时间:2018-09-03 03:15:54

标签: python tensorflow

我使用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设置为返回值时,我才能使用ab值传递给b。否则,将无法访问b。如果要访问函数范围内的许多操作,则应设置许多返回值。这很丑。

我想知道使用te​​nsorflow运行函数时幕后发生的事情以及如何在函数范围内访问ops。

谢谢!

2 个答案:

答案 0 :(得分:1)

很明显,访问op(或张量)确实需要一些引用。恕我直言,一种标准的解决方法是在类中构建图形,并设置类的某些张量属性,然后通过对象访问它们。

或者,如果您更倾向于函数式方法,那么比单独返回所有相关的操作和张量更好的方法是返回一个dict(或namedtuple)。

此外,还有一些专门的函数可以按名称返回操作,例如: get_operation_by_name

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

答案 1 :(得分:0)

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

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

例如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源代码tensorflow/core/framework中找到protobuf定义,并在那里找到一些.proto文件。