我使用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
将b
值传递给b
。否则,将无法访问b
。如果要访问函数范围内的许多操作,则应设置许多返回值。这很丑。
我想知道使用tensorflow运行函数时幕后发生的事情以及如何在函数范围内访问ops。
谢谢!
答案 0 :(得分:1)
很明显,访问op(或张量)确实需要一些引用。恕我直言,一种标准的解决方法是在类中构建图形,并设置类的某些张量属性,然后通过对象访问它们。
或者,如果您更倾向于函数式方法,那么比单独返回所有相关的操作和张量更好的方法是返回一个dict(或namedtuple)。
此外,还有一些专门的函数可以按名称返回操作,例如: get_operation_by_name
。
除了这个问题之外,您可能还想尝试eager execution,这是必须的。
答案 1 :(得分:0)
使用op函数时会发生三件事:
例如a = tf.add(b, c, name='add')
,
Add
的节点添加到默认图形,名称为'add'因此,您可以通过sess.graph
访问节点,有许多访问节点的函数,例如get_operation_by_name。
此外,您可以通过sess.graph_def
操作该图,该序列是带有protobuf的序列化图,您可以在tensorflow源代码tensorflow/core/framework
中找到protobuf定义,并在那里找到一些.proto文件。