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.