2015-11-18 13 views
29

Dopo l'allenamento del modello cnn, voglio visualizzare il peso o stampare i pesi, cosa posso fare? Non riesco nemmeno a stampare le variabili dopo l'allenamento. Grazie!Come posso visualizzare i pesi (variabili) in cnn in Tensorflow?

+0

Inoltre, date un'occhiata all'esempio tensorboard: https://github.com/tensorflow/tensorflow/issues/225 – Blaze

+0

Vedere anche: [Come può visualizzare filtri di convoluzione tensorflow ?] (http://stackoverflow.com/q/39361943/562769) –

risposta

25

di visualizzare i pesi, è possibile utilizzare un tf.image_summary() op per trasformare un filtro convoluzionale (o una fetta di un filtro) in un proto sintesi, la scrive su un registro utilizzando un tf.train.SummaryWriter, e visualizzare il registro utilizzando TensorBoard.

Diciamo che avete il seguente programma (semplificato):

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) 

Dopo aver fatto questo, si può iniziare TensorBoard di visualizzare i log in /tmp/logs, e sarete in grado di vedere una visualizzazione del filtro.

Si noti che questo trucco visualizza i filtri di profondità 3 come immagini RGB (per abbinare i canali dell'immagine di input). Se hai filtri più profondi o non hanno senso interpretarli come canali di colore, puoi usare l'op tf.split() per dividere il filtro sulla dimensione di profondità e generare un riassunto di immagine per profondità.

+0

Cosa succede se voglio solo stamparlo? Come posso raggiungere una variabile con name_scope ike "conv1" il cui nome è 'weight'? – Wuchen

+1

Se si desidera stampare la variabile, è possibile passare l'oggetto 'tf.Variable' a' sess.run() 'e restituirà una matrice numerica contenente i pesi. – mrry

+1

@ Wuchen Ecco come ottenere una variabile "weight" nell'ambito scope "conv1" - con tf.variable_scope ('conv1') come scope_conv: weights = tf.get_variable ('weights') – etoropov

18

Come @mrry ha detto, è possibile utilizzare tf.image_summary. Ad esempio, per cifar10_train.py, è possibile inserire questo codice da qualche parte sotto def train(). Si noti come si accede a un var in ambito '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) 

Se si desidera visualizzare tutti i tuoi conv1 filtri in una bella griglia, che avrebbe dovuto organizzarli in una griglia da soli. Ho fatto che oggi, così ora mi piacerebbe condividere un gist for visualizing conv1 as a grid

+0

Funziona per me! Grazie – Tanvir

+1

se i canali sono 16, come fare per visualizzarli? – raptoravis

+0

@raptoravis Non esiste un modo predefinito e non ha molto senso. Immagino che questo non sia per il primo livello.Se volessi farlo, modificherei la sostanza nella risposta per visualizzare 16 griglie, ciascuna per 1 canale (scala di grigi) – etoropov

1

È possibile estrarre i valori come array numpy seguente modo:

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) 

Si noti che è necessario regolare la portata ('conv1' nel mio caso) e il nome della variabile ('weights' nel mio caso).

Quindi si riduce a visualizzare gli array numpy. Un esempio come visualizzare le matrici NumPy è

#!/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) 
+0

Ho dovuto usare 'con open (" conv1.weights.npz "," wb ") come outfile:' (nota la b) con python 3. – mimoralea

Problemi correlati