Question
I have been using the introductory example of matrix multiplication in TensorFlow.
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
When I print the product, it is displaying it as a Tensor
object:
<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>
But how do I know the value of product
?
The following doesn't help:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
I know that graphs run on Sessions
, but isn't there any way I can check the
output of a Tensor
object without running the graph in a session
?
Answer
The easiest[A] way to evaluate the actual value of a Tensor
object is to
pass it to the Session.run()
method, or call Tensor.eval()
when you have a
default session (i.e. in a with tf.Session():
block, or see below). In
general[B], you cannot print the value of a tensor without running some code
in a session.
If you are experimenting with the programming model, and want an easy way to
evaluate tensors, the
tf.InteractiveSession
lets you open a session at the start of your program, and then use that
session for all Tensor.eval()
(and Operation.run()
) calls. This can be
easier in an interactive setting, such as the shell or an IPython notebook,
when it's tedious to pass around a Session
object everywhere. For example,
the following works in a Jupyter notebook:
with tf.Session() as sess: print(product.eval())
This might seem silly for such a small expression, but one of the key ideas in
Tensorflow 1.x is deferred execution : it's very cheap to build a large and
complex expression, and when you want to evaluate it, the back-end (to which
you connect with a Session
) is able to schedule its execution more
efficiently (e.g. executing independent parts in parallel and using GPUs).
[A]: To print the value of a tensor without returning it to your Python
program, you can use the
tf.print()
operator, as Andrzej suggests in another
answer. According to the
official documentation:
To make sure the operator runs, users need to pass the produced op to
tf.compat.v1.Session
's run method, or to use the op as a control dependency for executed ops by specifying withtf.compat.v1.control_dependencies([print_op]
), which is printed to standard output.
Also note that:
In Jupyter notebooks and colabs,
tf.print
prints to the notebook cell outputs. It will not write to the notebook kernel's console logs.
[B]: You might be able to use the
tf.get_static_value()
function to get the constant value of the given tensor if its value is
efficiently calculable.