如何在 tensorflow 中打印局部张量?
How do I print a local tensor in tensorflow?
我想在我的程序中打印一个张量,以便在它被评估后查看它的内部值。然而,问题在于张量是在函数内部声明的。为了更好地理解我的问题,这里有一些示例代码可以更好地解释我想做什么:
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 的变量作用域来访问变量然后对其求值。不幸的是,这会导致错误消息:
ValueError: Shape of a new variable (tfdiv/c:0) must be fully defined, but
instead was <unknown>.
我尝试使用 reuse=True 标志,但我仍然遇到同样的错误。关于如何解决这个问题的任何想法?最好是有一个 print(c) 等效项可以放入 divide 函数中,如上面的代码中所写。
这将实现你想要做的事情:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(d))
或者,您可以将最后一行替换为:
print(sess.run(tf.get_default_graph().get_tensor_by_name('tfdiv/c:0')))
了解 Python 端代码和 TensorFlow 端代码之间的区别很重要。在 python 中,您只需设置图形:d = divide(a, b)
创建如下内容:
你设置了一个节点(正方形),它将节点a
和[=13]中的数据分开=].它不会立即将它们分开!请注意,黑色为 python 变量名称,灰色为 TensorFlow 节点名称 1 。 a
和 b
也有一些默认名称,如果您没有指定的话。您用 name='c'
指定的灰色 "c"。局部变量 c
和全局变量 d
(Python) 都指的是同一个操作(节点)。
这就是为什么如果您说 print(d)
仅打印有关该节点的信息。设置图形后,执行 sess.run(d)
运行 TensorFlow 端 d
中的节点所需的所有节点 。然后它检索结果并将其作为 numpy 数组在 python 侧 上可用 。
您可以使用 tf.Print(input, data)
在 TF 端 打印张量 。请注意,这是一个对 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
):
现在operationc
的值会在每次求值的时候打印出来。请注意,每次评估其依赖项之一时也会打印它,例如,如果您稍后执行 e = d + 1
,当您评估 e
时,它需要 d
,这是指打印节点(从函数 divide
返回)。
最后请注意,如果您在 Jupyter notebook 中执行此操作,打印将出现在 notebook 服务器的终端中。这个细节现在并不重要:)。
1 默认添加 :0
以便您可以使用 name_of_op:0
检索任何张量。操作名称(tfdiv/c
)和张量名称(tfdiv/c:0
)之间的区别。
我想在我的程序中打印一个张量,以便在它被评估后查看它的内部值。然而,问题在于张量是在函数内部声明的。为了更好地理解我的问题,这里有一些示例代码可以更好地解释我想做什么:
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 的变量作用域来访问变量然后对其求值。不幸的是,这会导致错误消息:
ValueError: Shape of a new variable (tfdiv/c:0) must be fully defined, but
instead was <unknown>.
我尝试使用 reuse=True 标志,但我仍然遇到同样的错误。关于如何解决这个问题的任何想法?最好是有一个 print(c) 等效项可以放入 divide 函数中,如上面的代码中所写。
这将实现你想要做的事情:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(d))
或者,您可以将最后一行替换为:
print(sess.run(tf.get_default_graph().get_tensor_by_name('tfdiv/c:0')))
了解 Python 端代码和 TensorFlow 端代码之间的区别很重要。在 python 中,您只需设置图形:d = divide(a, b)
创建如下内容:
你设置了一个节点(正方形),它将节点a
和[=13]中的数据分开=].它不会立即将它们分开!请注意,黑色为 python 变量名称,灰色为 TensorFlow 节点名称 1 。 a
和 b
也有一些默认名称,如果您没有指定的话。您用 name='c'
指定的灰色 "c"。局部变量 c
和全局变量 d
(Python) 都指的是同一个操作(节点)。
这就是为什么如果您说 print(d)
仅打印有关该节点的信息。设置图形后,执行 sess.run(d)
运行 TensorFlow 端 d
中的节点所需的所有节点 。然后它检索结果并将其作为 numpy 数组在 python 侧 上可用 。
您可以使用 tf.Print(input, data)
在 TF 端 打印张量 。请注意,这是一个对 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
):
现在operationc
的值会在每次求值的时候打印出来。请注意,每次评估其依赖项之一时也会打印它,例如,如果您稍后执行 e = d + 1
,当您评估 e
时,它需要 d
,这是指打印节点(从函数 divide
返回)。
最后请注意,如果您在 Jupyter notebook 中执行此操作,打印将出现在 notebook 服务器的终端中。这个细节现在并不重要:)。
1 默认添加 :0
以便您可以使用 name_of_op:0
检索任何张量。操作名称(tfdiv/c
)和张量名称(tfdiv/c:0
)之间的区别。