python - que - tensorflow redes neuronales
¿Cómo puedo visualizar los pesos(variables) en cnn en Tensorflow? (3)
Como dijo @mrry, puedes usar tf.image_summary
. Por ejemplo, para cifar10_train.py
, puedes poner este código en algún lugar debajo de def train()
. Tenga en cuenta cómo accede a var en el ámbito ''conv1''
# Visualize conv1 features
with tf.variable_scope(''conv1'') as scope_conv:
weights = tf.get_variable(''weights'')
# scale weights to [0 255] and convert to uint8 (maybe change scaling?)
x_min = tf.reduce_min(weights)
x_max = tf.reduce_max(weights)
weights_0_to_1 = (weights - x_min) / (x_max - x_min)
weights_0_to_255_uint8 = tf.image.convert_image_dtype (weights_0_to_1, dtype=tf.uint8)
# to tf.image_summary format [batch_size, height, width, channels]
weights_transposed = tf.transpose (weights_0_to_255_uint8, [3, 0, 1, 2])
# this will display random 3 filters from the 64 in conv1
tf.image_summary(''conv1/filters'', weights_transposed, max_images=3)
Si desea visualizar todos sus filtros conv1
en una cuadrícula agradable, tendría que organizarlos en una cuadrícula usted mismo. Lo hice hoy, así que ahora me gustaría compartir una idea para visualizar conv1 como una grilla
Después de entrenar el modelo cnn, quiero visualizar el peso o imprimir los pesos, ¿qué puedo hacer? Ni siquiera puedo imprimir las variables después del entrenamiento. ¡Gracias!
Puede extraer los valores como matrices numpy de la siguiente manera:
with tf.variable_scope(''conv1'', reuse=True) as scope_conv:
W_conv1 = tf.get_variable(''weights'', shape=[5, 5, 1, 32])
weights = W_conv1.eval()
with open("conv1.weights.npz", "w") as outfile:
np.save(outfile, weights)
Tenga en cuenta que debe ajustar el alcance ( ''conv1''
en mi caso) y el nombre de la variable ( ''weights''
en mi caso).
Luego se reduce al visualizar matrices numpy. Un ejemplo de cómo visualizar matrices numpy es
#!/usr/bin/env python
"""Visualize numpy arrays."""
import numpy as np
import scipy.misc
arr = np.load(''conv1.weights.npb'')
# Get each 5x5 filter from the 5x5x1x32 array
for filter_ in range(arr.shape[3]):
# Get the 5x5x1 filter:
extracted_filter = arr[:, :, :, filter_]
# Get rid of the last dimension (hence get 5x5):
extracted_filter = np.squeeze(extracted_filter)
# display the filter (might be very small - you can resize the window)
scipy.misc.imshow(extracted_filter)
Para visualizar los pesos, puede usar un tf.image_summary()
op para transformar un filtro convolucional (o un sector de un filtro) en un tf.train.SummaryWriter
resumen, escribirlos en un registro usando un tf.train.SummaryWriter
, y visualizar el registro usando TensorBoard .
Supongamos que tiene el siguiente programa (simplificado):
filter = tf.Variable(tf.truncated_normal([8, 8, 3]))
images = tf.placeholder(tf.float32, shape=[None, 28, 28])
conv = tf.nn.conv2d(images, filter, strides=[1, 1, 1, 1], padding="SAME")
# More ops...
loss = ...
optimizer = tf.GradientDescentOptimizer(0.01)
train_op = optimizer.minimize(loss)
filter_summary = tf.image_summary(filter)
sess = tf.Session()
summary_writer = tf.train.SummaryWriter(''/tmp/logs'', sess.graph_def)
for i in range(10000):
sess.run(train_op)
if i % 10 == 0:
# Log a summary every 10 steps.
summary_writer.add_summary(filter_summary, i)
Después de hacer esto, puede iniciar TensorBoard para visualizar los registros en /tmp/logs
, y podrá ver una visualización del filtro.
Tenga en cuenta que este truco visualiza los filtros de profundidad 3 como imágenes RGB (para que coincida con los canales de la imagen de entrada). Si tiene filtros más profundos o no tiene sentido interpretarlos como canales de color, puede usar tf.split()
op para dividir el filtro en la dimensión de profundidad y generar un resumen de imagen por profundidad.