¿Cómo puedo visualizar los pesos (variables) en cnn en Tensorflow?

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!

Para visualizar los pesos, puede usar un op tf.image_summary() para transformar un filtro convolucional (o una porción de un filtro) en un resumen proto, escribirlos en un registro usando un tf.train.SummaryWriter , y visualizar el registro utilizando TensorBoard .

Digamos que tienes el siguiente progtwig (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 coincidir con los canales de la imagen de entrada). Si tiene filtros más profundos, o no tienen sentido interpretarlos como canales de color, puede usar la op tf.split() para dividir el filtro en la dimensión de profundidad y generar un resumen de imagen por profundidad.

Como dijo @mrry, puedes usar tf.image_summary . Por ejemplo, para cifar10_train.py , puede poner este código en algún lugar bajo def train() . Observe cómo accede a una var bajo el scope ‘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 grilla agradable, tendrá que organizarlos usted mismo en una cuadrícula. Hice eso hoy, así que ahora me gustaría compartir una idea para visualizar conv1 como una cuadrícula

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 scope ( 'conv1' en mi caso) y el nombre de la variable ( 'weights' en mi caso).

Luego se reduce a la visualización de 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)