xticks pyplot font example python matplotlib tensorflow tensorboard

python - pyplot - plot title font size matplotlib



Tensorflow: cómo mostrar imágenes personalizadas en Tensorboard(por ejemplo, gráficos de Matplotlib) (4)

La sección Tablero de imágenes del archivo Léame de Tensorboard dice:

Dado que el panel de imagen admite pngs arbitrarios, puede usar esto para incrustar visualizaciones personalizadas (por ejemplo, diagramas de dispersión matplotlib) en TensorBoard.

Veo cómo se puede escribir una imagen de un gráfico de puntos en un archivo, volver a leer como un tensor y luego usarse con tf.image_summary () para escribirla en TensorBoard, pero esta declaración del archivo Léame sugiere que hay una forma más directa. ¿Esta ahí? Si es así, ¿hay más documentación y / o ejemplos de cómo hacer esto de manera eficiente?


El siguiente script no usa codificación RGB / PNG intermedia. También soluciona el problema con la construcción de la operación adicional durante la ejecución, se reutiliza un solo resumen.

Se espera que el tamaño de la figura permanezca igual durante la ejecución.

Solución que funciona:

import matplotlib.pyplot as plt import tensorflow as tf import numpy as np def get_figure(): fig = plt.figure(num=0, figsize=(6, 4), dpi=300) fig.clf() return fig def fig2rgb_array(fig, expand=True): fig.canvas.draw() buf = fig.canvas.tostring_rgb() ncols, nrows = fig.canvas.get_width_height() shape = (nrows, ncols, 3) if not expand else (1, nrows, ncols, 3) return np.fromstring(buf, dtype=np.uint8).reshape(shape) def figure_to_summary(fig): image = fig2rgb_array(fig) summary_writer.add_summary( vis_summary.eval(feed_dict={vis_placeholder: image})) if __name__ == ''__main__'': # construct graph x = tf.Variable(initial_value=tf.random_uniform((2, 10))) inc = x.assign(x + 1) # construct summary fig = get_figure() vis_placeholder = tf.placeholder(tf.uint8, fig2rgb_array(fig).shape) vis_summary = tf.summary.image(''custom'', vis_placeholder) with tf.Session() as sess: tf.global_variables_initializer().run() summary_writer = tf.summary.FileWriter(''./tmp'', sess.graph) for i in range(100): # execute step _, values = sess.run([inc, x]) # draw on the plot fig = get_figure() plt.subplot(''111'').scatter(values[0], values[1]) # save the summary figure_to_summary(fig)


Es bastante fácil de hacer si tienes la imagen en un búfer de memoria. A continuación, muestro un ejemplo, donde se guarda una pirplotación en un búfer y luego se convierte en una representación de imagen TF que luego se envía a un resumen de imagen.

import io import matplotlib.pyplot as plt import tensorflow as tf def gen_plot(): """Create a pyplot plot and save to buffer.""" plt.figure() plt.plot([1, 2]) plt.title("test") buf = io.BytesIO() plt.savefig(buf, format=''png'') buf.seek(0) return buf # Prepare the plot plot_buf = gen_plot() # Convert PNG buffer to TF image image = tf.image.decode_png(plot_buf.getvalue(), channels=4) # Add the batch dimension image = tf.expand_dims(image, 0) # Add image summary summary_op = tf.summary.image("plot", image) # Session with tf.Session() as sess: # Run summary = sess.run(summary_op) # Write summary writer = tf.train.SummaryWriter(''./logs'') writer.add_summary(summary) writer.close()

Esto da la siguiente visualización de TensorBoard:


Esto pretende completar la respuesta de Andrzej Pronobis. Siguiendo de cerca su buen post, configuré este mínimo ejemplo de trabajo :

plt.figure() plt.plot([1, 2]) plt.title("test") buf = io.BytesIO() plt.savefig(buf, format=''png'') buf.seek(0) image = tf.image.decode_png(buf.getvalue(), channels=4) image = tf.expand_dims(image, 0) summary = tf.summary.image("test", image, max_outputs=1) writer.add_summary(summary, step)

Donde escritor es una instancia de tf.summary.FileWriter . Esto me dio el siguiente error: AttributeError: el objeto ''Tensor'' no tiene atributo ''valor'' Por el cual esta publicación de github tuvo la solución: el resumen debe ser evaluado (convertido en una cadena) antes de agregarse al escritor . Así que el código de trabajo para mí se mantuvo como sigue (simplemente agregue la llamada .eval () en la última línea):

plt.figure() plt.plot([1, 2]) plt.title("test") buf = io.BytesIO() plt.savefig(buf, format=''png'') buf.seek(0) image = tf.image.decode_png(buf.getvalue(), channels=4) image = tf.expand_dims(image, 0) summary = tf.summary.image("test", image, max_outputs=1) writer.add_summary(summary.eval(), step)

Esto podría ser lo suficientemente corto como para ser un comentario sobre su respuesta, pero se pueden pasar por alto fácilmente (y es posible que yo también esté haciendo algo diferente), así que aquí está, ¡espero que ayude!

Aclamaciones,
Andres


Un poco tarde con mi respuesta. Con tf-matplotlib un simple diagrama de dispersión se reduce a:

import tensorflow as tf import numpy as np import tfmpl @tfmpl.figure_tensor def draw_scatter(scaled, colors): ''''''Draw scatter plots. One for each color.'''''' figs = tfmpl.create_figures(len(colors), figsize=(4,4)) for idx, f in enumerate(figs): ax = f.add_subplot(111) ax.axis(''off'') ax.scatter(scaled[:, 0], scaled[:, 1], c=colors[idx]) f.tight_layout() return figs with tf.Session(graph=tf.Graph()) as sess: # A point cloud that can be scaled by the user points = tf.constant( np.random.normal(loc=0.0, scale=1.0, size=(100, 2)).astype(np.float32) ) scale = tf.placeholder(tf.float32) scaled = points*scale # Note, `scaled` above is a tensor. Its being passed `draw_scatter` below. # However, when `draw_scatter` is invoked, the tensor will be evaluated and a # numpy array representing its content is provided. image_tensor = draw_scatter(scaled, [''r'', ''g'']) image_summary = tf.summary.image(''scatter'', image_tensor) all_summaries = tf.summary.merge_all() writer = tf.summary.FileWriter(''log'', sess.graph) summary = sess.run(all_summaries, feed_dict={scale: 2.}) writer.add_summary(summary, global_step=0)

Cuando se ejecuta, esto da como resultado el siguiente gráfico dentro de Tensorboard

Tenga en cuenta que tf-matplotlib se encarga de evaluar las entradas del tensor, evita los pyplot subprocesos de pyplot y admite el blit para el trazado crítico en tiempo de ejecución.