我想在我的程序中打印一个张量,一旦它被计算出来,就可以看到它的内部值。然而,问题是张量是在函数内部声明的。为了更好地理解我的问题,下面是一些示例代码,以更好地解释我要做的事情:
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函数中,正如上面的代码所写的那样。在
这将实现您的目标:
或者,可以将最后一行替换为:
^{pr2}$理解Python端代码和TensorFlow端代码之间的区别是很重要的。在python中,只需设置图形:
d = divide(a, b)
会创建类似以下内容:您设置了一个节点(正方形),它将分割节点}也有一些默认名称,如果您没有指定它们的话。用}(Python)都引用同一个操作(节点)。在
a
和b
中的数据。不会马上把他们分开!注意,黑色的是python变量名,灰色是TensorFlow节点名1。a
和{name='c'
指定的灰色“c”。局部变量c
和全局变量{这就是为什么如果您说
print(d)
只打印有关该节点的信息。一旦您设置了图形,执行sess.run(d)
将运行位于TensorFlow侧上的d
中的节点所需的所有节点。然后它检索结果,并将其作为numpy数组在python端上可用。在您可以使用^{} 在TF-side上打印张量。注意这是一个对
input
张量没有任何影响的操作(图中的节点),它只传递它,同时还打印data
中的所有内容。在在您的例子中,您可以在tensorflow侧使用
Print
,如下所示:这将有效地在图中添加另一个节点(在TF侧命名为
P
):现在每次计算operation},它引用打印节点(从函数
c
的值都将被打印出来。注意,它还将在每次计算它的一个依赖项时被打印,例如,如果您稍后执行e = d + 1
,当您计算e
时,它需要{divide
返回)。在最后,请注意,如果您在Jupyter笔记本中执行此操作,打印将出现在笔记本服务器的终端上。具体细节目前并不重要:)。在
1默认情况下添加
:0
,以便您可以使用name_of_op:0
检索任何张量。操作名(tfdiv/c
)和张量名(tfdiv/c:0
)之间的区别。在相关问题 更多 >
编程相关推荐