Is there a way to get the output of the tf.Print tensor for output on the output of a Jupyter Notebook

I am using tf.Print op in a Jupyter laptop. It works as needed, but will only print output to the console without printing on the laptop. Is there any way around this?

An example is the following (in a notebook):

import tensor flow as tf

a = tf.constant (1.0)

a = tf.Print (a, [a], 'hi')

sess = tf.Session ()

a.eval (session = Sess)

This code will print "hi [1]" in the console, but nothing in the notebook.

+7
tensorflow jupyter-notebook
source share
3 answers

Update February 3, 2017 I wrapped this in a memory_util package. Usage example

# install memory util import urllib.request response = urllib.request.urlopen("https://raw.githubusercontent.com/yaroslavvb/memory_util/master/memory_util.py") open("memory_util.py", "wb").write(response.read()) import memory_util sess = tf.Session() a = tf.random_uniform((1000,)) b = tf.random_uniform((1000,)) c = a + b with memory_util.capture_stderr() as stderr: sess.run(c.op) print(stderr.getvalue()) 

** Old material **

You can reuse the FD redirector from the IPython kernel. (idea from Mark Sandler)

 import os import sys STDOUT = 1 STDERR = 2 class FDRedirector(object): """ Class to redirect output (stdout or stderr) at the OS level using file descriptors. """ def __init__(self, fd=STDOUT): """ fd is the file descriptor of the outpout you want to capture. It can be STDOUT or STERR. """ self.fd = fd self.started = False self.piper = None self.pipew = None def start(self): """ Setup the redirection. """ if not self.started: self.oldhandle = os.dup(self.fd) self.piper, self.pipew = os.pipe() os.dup2(self.pipew, self.fd) os.close(self.pipew) self.started = True def flush(self): """ Flush the captured output, similar to the flush method of any stream. """ if self.fd == STDOUT: sys.stdout.flush() elif self.fd == STDERR: sys.stderr.flush() def stop(self): """ Unset the redirection and return the captured output. """ if self.started: self.flush() os.dup2(self.oldhandle, self.fd) os.close(self.oldhandle) f = os.fdopen(self.piper, 'r') output = f.read() f.close() self.started = False return output else: return '' def getvalue(self): """ Return the output captured since the last getvalue, or the start of the redirection. """ output = self.stop() self.start() return output import tensorflow as tf x = tf.constant([1,2,3]) a=tf.Print(x, [x]) redirect=FDRedirector(STDERR) sess = tf.InteractiveSession() redirect.start(); a.eval(); print "Result" print redirect.stop() 
+4
source share

I ran into the same problem and circumvented it using this feature on my laptops:

 def tf_print(tensor, transform=None): # Insert a custom python operation into the graph that does nothing but print a tensors value def print_tensor(x): # x is typically a numpy array here so you could do anything you want with it, # but adding a transformation of some kind usually makes the output more digestible print(x if transform is None else transform(x)) return x log_op = tf.py_func(print_tensor, [tensor], [tensor.dtype])[0] with tf.control_dependencies([log_op]): res = tf.identity(tensor) # Return the given tensor return res # Now define a tensor and use the tf_print function much like the tf.identity function tensor = tf_print(tf.random_normal([100, 100]), transform=lambda x: [np.min(x), np.max(x)]) # This will print the transformed version of the tensors actual value # (which was summarized to just the min and max for brevity) sess = tf.InteractiveSession() sess.run([tensor]) sess.close() 

FYI, using the logger instead of calling “print” in my custom function, did wonders for me, since stdout is often buffered by jupyter and doesn’t appear before the error “Loss is Nan” - this was generally using this function primarily in my case.

+2
source share

You can check the terminal where you started jupyter notebook to see the message.

 import tensorflow as tf tf.InteractiveSession() a = tf.constant(1) b = tf.constant(2) opt = a + b opt = tf.Print(opt, [opt], message="1 + 2 = ") opt.eval() 

In the terminal, I see:

 2018-01-02 23:38:07.691808: I tensorflow/core/kernels/logging_ops.cc:79] 1 + 2 = [3] 
0
source share

All Articles