如何在tensorflow中打印局部张量?

2024-05-17 04:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的程序中打印一个张量,一旦它被计算出来,就可以看到它的内部值。然而,问题是张量是在函数内部声明的。为了更好地理解我的问题,下面是一些示例代码,以更好地解释我要做的事情:

a = tf.Variable([[2,3,4], [5,6,7]])
b = tf.Variable([[1,2,2], [3,3,3]])

def divide(a,b):
    with tf.variable_scope('tfdiv', reuse=True):
        c = tf.divide(a,b, name='c')
    # Cannot print(c) here, as this will only yield tf info on c
    return c

d = divide(a,b)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(d)
    sess.run(tf.get_variable('tfdiv/c:0').eval(session=sess))

以前,我已经能够执行print(c.eval(session=sess)),但由于c现在是函数内部的局部变量,所以这行不通。从上面的代码中可以看出,我尝试使用tensorflow的变量范围来访问变量,然后对其求值。很遗憾,这会导致错误消息:

^{pr2}$

我试图使用reuse=True标志,但是仍然得到相同的错误。我有什么办法解决这个问题吗?最好是有一个print(c)等价物可以放入divide函数中,正如上面的代码所写的那样。在


Tags: 函数run代码truetfaswitheval
2条回答

这将实现您的目标:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(d))

或者,可以将最后一行替换为:

^{pr2}$

理解Python端代码和TensorFlow端代码之间的区别是很重要的。在python中,只需设置图形:d = divide(a, b)会创建类似以下内容: enter image description here

您设置了一个节点(正方形),它将分割节点ab中的数据。不会马上把他们分开!注意,黑色的是python变量名,灰色是TensorFlow节点名1a和{}也有一些默认名称,如果您没有指定它们的话。用name='c'指定的灰色“c”。局部变量c和全局变量{}(Python)都引用同一个操作(节点)。在

这就是为什么如果您说print(d)只打印有关该节点的信息。一旦您设置了图形,执行sess.run(d)将运行位于TensorFlow侧上的d中的节点所需的所有节点。然后它检索结果,并将其作为numpy数组在python端上可用。在

您可以使用^{}在TF-side上打印张量。注意这是一个对input张量没有任何影响的操作(图中的节点),它只传递它,同时还打印data中的所有内容。在

在您的例子中,您可以在tensorflow侧使用Print,如下所示:

def divide(a,b):
    with tf.variable_scope('tfdiv', reuse=True):
        c = tf.divide(a,b, name='c')
        cp = tf.Print(c, [c], message='Value of c: ', name='P')

    return cp

这将有效地在图中添加另一个节点(在TF侧命名为P):

Graph of tensors illustrating the above

现在每次计算operationc的值都将被打印出来。注意,它还将在每次计算它的一个依赖项时被打印,例如,如果您稍后执行e = d + 1,当您计算e时,它需要{},它引用打印节点(从函数divide返回)。在

最后,请注意,如果您在Jupyter笔记本中执行此操作,打印将出现在笔记本服务器的终端上。具体细节目前并不重要:)。在

1默认情况下添加:0,以便您可以使用name_of_op:0检索任何张量。操作名(tfdiv/c)和张量名(tfdiv/c:0)之间的区别。在

相关问题 更多 >